Sql 如何做到这一点?

Sql 如何做到这一点?,sql,tsql,sql-server-2008-r2,Sql,Tsql,Sql Server 2008 R2,有以下数据的 格式如下 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

有以下数据的

格式如下

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
我怎样才能得到下面的布局

用红色标记的列

FREQ: "Count" of Days in "RDDYSR" field
LIFTS: "Lifts" = "RDQTY" times "Freq"
VOLUME: "Volume" = "RDQTY" times "RDSIZE" times "Freq"

Week Days columns: 
MON: If "RDDYSR" includes "M", "RDQTY" times "RDSIZE", else "blank".  
TUE: If "RDDYSR" includes "T", "RDQTY" times "RDSIZE", else "blank", etc.
注释

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).
谢谢你的帮助。

试试这个查询

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

这应该给你你想要的东西一点简单。我不确定星期天的标识符是什么,所以我已经用--


SQLFIDLE:

您试过什么吗?你找过什么东西吗?RDSIZE的数值是多少,例如,它可能是“-0”、“IV”、“pi”吗?提示:使用适当的软件(MySQL、Oracle、DB2等)和版本(例如,
sql-server-2014
)标记数据库问题很有帮助。语法和功能上的差异通常会影响答案。到目前为止,我可以做的是从RDDYSR字段中删除破折号,这样很容易计算周天数。这是一个开始。您可能需要使用一个表达式来帮助处理日列,例如,当CharIndex('M',RDDYSR)>0时,则使用RDQTY*Cast(RDSIZE为Int)或NULL end。请注意,通常认为将任意数据类型混合在一起是一种不好的做法,例如在
VARCHAR(2)
中存储一个大小,或者使用一个返回数值计算结果的单个(
RDQTY*RDSIZE
)作为字符串或单词
blank
。使用您的查询,我在将数据类型varchar转换为numeric时遇到此错误。此查询非常适合我。我认为你最好的办法就是找出哪条线在突破它。您的一个数字数据类型可能是varchar。@Stephan请查看客户BRINKMANN硬件如何为每个实例获得相同的RDDYSR,即使最后一个不同@请看我的笔记。您的查询工作正常,但未按我的笔记所示分组抱歉,我错过了这一点。在底部添加一个简单的groupby应该可以解决这个问题(参见上面更新的内容)。SQL Fiddle也已更新。生成此错误消息的原因是什么?将varchar值“1”转换为数据类型int时,转换失败。它在1之后有一个句号。因此,在您的表中,必须在其中一个字段中的1之后有一个句号。真的吗?如果您只在这些列中保留整数,那么它们应该设置为int而不是varchar。您是否确保将它们全部更改为这个值?可能是某些行中除了句号之外还有其他无效字符
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