2015-04-23 39 views
0

下面格式如何做到这一点?具有低于数据</p> <p><img src="https://i.stack.imgur.com/mgmPv.jpg" alt="enter image description here"></p> <p>

CREATE TABLE [dbo].[Sample](
    [CCMPNY] [varchar](2) NOT NULL, 
    [CCUST#] [numeric](7, 0) NOT NULL, 
    [RDDYSR] [varchar](7) NOT NULL, 
    [CBLNAM] [varchar](30) NOT NULL, 
    [CCYCLE] [varchar](2) NOT NULL, 
    [RDSIZE] [varchar](2) NOT NULL, 
    [RDCHGC] [varchar](2) NOT NULL, 
    [RDDAY] [numeric](1, 0) NOT NULL, 
    [RDROUT] [varchar](4) NOT NULL, 
    [RDQTY] [numeric](5, 0) NOT NULL 

我如何能得到以下布局

enter image description here

列红色

标记

注意

that each "CCUST" generates only one data line unless 
(1) there are multiple "RDCHGC" values (CCUST 43), 
(2) there are multiple "RDSIZE" values (CCUST 10723); or, 
(3) there are multiple "FREQ" values (no example). 

感谢您的帮助。

+1

你尝试过什么?你有没有搜索过任何东西?数字是如何被“RDSIZE”,例如它可能是'-0','IV','pi'吗?提示:使用适当的软件(MySQL,Oracle,DB2,...)和版本(例如, '的SQL服务器2014'。语法和功能的差异往往会影响答案。 – HABO

+0

我到目前为止所能做的就是从RDDYSR字段中删除破折号,这种方式很容易计算一周的日子。 – cojimarmiami

+0

这是一个开始。您可能需要使用['CASE'](https://msdn.microsoft.com/zh-CN/library/ms181765.aspx)表达式来帮助处理日期列,例如当CharIndex('M',RDDYSR)> 0然后RDQTY * Cast(RDSIZE as Int)else NULL end'时。请注意,通常认为将任意数据类型混合在一起是一种不好的做法,例如,将大小存储在“VARCHAR(2)”中,或者将一个大小作为字符串或单词“空白”返回给数字计算结果(“RDQTY * RDSIZE”)。 – HABO

回答

1

这应该给你,你找什么有点简单。我不知道你的周日标识所以我对此评论了这一点 -

select CCUST# CCUST, CBLNAM,RDCHGC, RDQTY, RDSIZE, Len(Replace(RDDYSR, '-', '')) FREQ, 
RDQTY * Len(Replace(RDDYSR, '-', '')) LIFTS, 
RDQTY * Cast(RDSIZE as int) * Len(Replace(RDDYSR, '-', '')) Volume, RDDYSR, 
Case when CHARINDEX('M', RDDYSR) > 0 then RDQTY * Cast(RDSIZE as int) end as Mon, 
Case when CHARINDEX('T', RDDYSR) > 0 then RDQTY * Cast(RDSIZE as int) end as Tue, 
Case when CHARINDEX('W', RDDYSR) > 0 then RDQTY * Cast(RDSIZE as int) end as Wed, 
Case when CHARINDEX('H', RDDYSR) > 0 then RDQTY * Cast(RDSIZE as int) end as Thu, 
Case when CHARINDEX('F', RDDYSR) > 0 then RDQTY * Cast(RDSIZE as int) end as Fri, 
Case when CHARINDEX('S', RDDYSR) > 0 then RDQTY * Cast(RDSIZE as int) end as Sat 
--,Case when CHARINDEX(RDDYSR, 'X') > 0 then RDQTY * Cast(RDSIZE as int) end as Sun --Whatever Sunday identifier is 

from Sample 

Group by CCUST#, CBLNAM, RDCHGC, RDQTY, RDSIZE, RDDYSR 

SQLFiddle:http://www.sqlfiddle.com/#!6/cdb92/1/0

+0

@ChistianBarron请阅读我的笔记。你的查询工作正常,但不分组,因为我的笔记指示 – cojimarmiami

+0

对不起,我错过了那一点。在底部添加一个简单的Group By应该将其排序(参见上面的更新)。 SQL小提琴也被更新 –

+0

什么可能会产生这个错误信息?转换varchar值“1”时转换失败。到数据类型int。 – cojimarmiami

1

尝试此查询,

SELECT CCUST 
,CBLNAM 
,RDCHGC 
,RDQTY 
,RDSIZE 
,LEN(REPLACE(RDDYSR,'-','')) AS FREQ 
,COUNT(RDDYSR)*RDQTY AS LIFTS 
,RDSIZE * RDQTY * LEN(REPLACE(RDDYSR,'-','')) AS VOLUME 
,FIRSTRDDYSR AS RDDYSR,FIRSTRDROUT AS RDROUT 
,CASE WHEN (FIRSTRDDYSR LIKE 'M______') THEN RDQTY * RDSIZE END AS MON 
,CASE WHEN (FIRSTRDDYSR LIKE '_T_____') THEN RDQTY * RDSIZE END AS TUE 
,CASE WHEN (FIRSTRDDYSR LIKE '__W____') THEN RDQTY * RDSIZE END AS WED 
,CASE WHEN (FIRSTRDDYSR LIKE '___H___') THEN RDQTY * RDSIZE END AS THU 
,CASE WHEN (FIRSTRDDYSR LIKE '____F__') THEN RDQTY * RDSIZE END AS FRI 
,CASE WHEN (FIRSTRDDYSR LIKE '_____S_') THEN RDQTY * RDSIZE END AS SAT 
FROM 
(
    SELECT S.*, T.RDROUT AS FIRSTRDROUT, T.RDDYSR AS FIRSTRDDYSR FROM 
    [SAMPLE] S 
    INNER JOIN 
    (
     SELECT CCUST, RDROUT, RDDYSR, ROW_NUMBER() OVER(PARTITION BY ccust ORDER BY (SELECT 1)) N 
     FROM SAMPLE 
    ) T ON S.CCUST = T.CCUST AND N = 1 
) Tbl 

GROUP BY CCUST, CBLNAM, RDCHGC, RDQTY, RDSIZE, RDDYSR, FIRSTRDDYSR, FIRSTRDROUT 
+0

使用您的查询我收到此错误将数据类型varchar转换为数字时出错。 – cojimarmiami

+0

这个查询对我来说非常合适。我认为你最好的选择就是找出哪条线是打破它的。你的一个数字数据类型可能是一个varchar。 – Stephan

+0

@Stephan请看客户BRINKMANN HARDWARE如何获得与每个实例相同的RDDYSR,即使最后一个不同...... ...... http://www.sqlfiddle.com/#!6/4f8e8/6 – cojimarmiami

相关问题