在具有条件的SQL Server中使用Pivot将行转换为列

在具有条件的SQL Server中使用Pivot将行转换为列,sql,sql-server,pivot,union,Sql,Sql Server,Pivot,Union,我有下表中的数据([DSIMEPPD].dbo.[DARPD.MEP0000]): WCLABELNR WCMCU WCCO wcdreer WCNETT WCVR01 WCDATETIME WCDL01 25041 160001 00160 0 1000 19759 2019-12-0522:44:16 P1-P2-P3-P5-SF 25042 160001 00160 0 1000 19759 2019-12-0522:59:00 P1-P2-P3-P5-SF 25043 160001 00

我有下表中的数据(
[DSIMEPPD].dbo.[DARPD.MEP0000]
):

WCLABELNR WCMCU WCCO wcdreer WCNETT WCVR01 WCDATETIME WCDL01
25041 160001 00160 0 1000 19759 2019-12-0522:44:16 P1-P2-P3-P5-SF
25042 160001 00160 0 1000 19759 2019-12-0522:59:00 P1-P2-P3-P5-SF
25043 160001 00160 0 1017 19759 2019-12-0523:58:50 P1-P2-P3-P5-SF
25055 160001 00160 0 1000 19383 2019-12-0612:59:41空
36284 150001 00150 A 1000 19281 2019-12-0522:02:22欧洲蝙蝠SNC ABP
36285 150001 00150 A 787 19281 2019-12-0523:03:58欧元BATK SNC ABP
36293 150001 00150 A 1002 19282 2019-12-0612:07:29空
37997 140001 00140 J 560 19292 2019-12-0521:53:45 Pangassius F 2000
37998 140001 00140 G 552 19292 2019-12-0522:39:33 Pangassius F 2000
37999 140001 00140 G 551 19292 2019-12-0523:25:18 Pangassius F 2000
38012 140001 00140 P 579 19292 2019-12-0609:50:56空
38013 140001 00140 G 575 19292 2019-12-0610:40:55空
49137 120001 00120 B 1228 19343 2019-12-0523:36:33 P1 VH-P2-P43
49138 120001 00120 B 1202 19343 2019-12-0523:49:18 P1 VH-P2-P43
49163 120001 00120 A 1100 19344 2019-12-0611:03:56空
我希望它能成为一个数据透视表,如下所示:

Date GentGel GentPep AngGel AngPep ISSGel ISSPep GerGel GerPep总计
2019-12-05  2430        560 1103    1787        3017        8897
2019-12-06  1100        579 575 1002        1000        4256
我第一次尝试:

选择left(WCDATETIME,10)作为日期,sum(cast(WCNETT作为十进制数))作为[DSIMEPPD].dbo.[DARPD.MEP0000]中的GentGel,其中WCMCU=120001,wcdreer'G'和WCDATETIME在@Date1和@Date2组之间按left(WCDATETIME,10),WCCO
选择left(WCDATETIME,10)作为日期,sum(cast(WCNETT作为十进制数))作为GentPep,从[dsimepd].dbo.[DARPD.MEP0000]中选择,其中WCMCU=120001,wcdreer='G'和WCDATETIME在@Date1和@Date2之间向左分组(WCDATETIME,10),WCCO
选择left(WCDATETIME,10)作为日期,sum(cast(WCNETT作为十进制数))作为[DSIMEPPD].dbo.[DARPD.MEP0000]中的AngGel,其中WCMCU=140001,WCCO的“G”和WCDATETIME在@Date1和@Date2组之间向左(WCDATETIME,10),WCCO
选择left(WCDATETIME,10)作为日期,sum(cast(WCNETT作为十进制数))作为[DSIMEPPD].dbo.[DARPD.MEP0000]中的AngPep,其中WCMCU=140001,wcdreer='G'和WCDATETIME在@Date1和@Date2之间按左键分组(WCDATETIME,10),WCCO
选择left(WCDATETIME,10)作为日期,sum(cast(WCNETT作为十进制数))作为[DSIMEPPD].dbo.[DARPD.MEP0000]中的ISSGel,其中WCMCU=150001,WCCO的“G”和WCDATETIME在@Date1和@Date2组之间向左(WCDATETIME,10),WCCO
选择left(WCDATETIME,10)作为日期,sum(cast(WCNETT作为十进制数))作为[DSIMEPPD].dbo.[DARPD.MEP0000]中的ISSPep,其中WCMCU=150001,wcdreer='G'和WCDATETIME在@Date1和@Date2之间按左键分组(WCDATETIME,10),WCCO
选择left(WCDATETIME,10)作为日期,sum(cast(WCNETT作为十进制数))作为[DSIMEPPD].dbo.[DARPD.MEP0000]中的GerGel,其中WCMCU=160001,WCCO的“G”和WCDATETIME在@Date1和@Date2组之间向左(WCDATETIME,10),WCCO
选择left(WCDATETIME,10)作为日期,sum(cast(WCNETT作为十进制数))作为[dsimepd].dbo.[DARPD.MEP0000]中的GerPep,其中WCMCU=160001,wcdreer='G'和WCDATETIME在@Date1和@Date2之间按左分组(WCDATETIME,10),WCCO
但是,我怎样才能用正确的布局将其放入一个查询中呢

另一种尝试是:

选择日期、[Gent]、[Angouleme]、[ISS]、[Gerona]、[Gent]+[Angouleme]+[ISS]+[Gerona]作为[TOTAAL]
从(
当“00120”时选择案例WCCO,当“00140”时选择“Gent”,当“00150”时选择“Angouleme”,当“00160”时选择“ISS”,然后选择“Gerona”结束为WCCO,
左(WCDATETIME,10)作为日期,
作为重量的总和
来自[DSIMEPPD].[dbo].[DARPD.MEP0000]
其中(WCMCU=120001或WCMCU=140001或WCMCU=150001或WCMCU=160001或WCMCU=170001)和WCMCU''
以及@Date1和@Date2之间的WCDATETIME
按WCCO分组,左侧(WCDATETIME,10),带汇总
)t
枢轴(WCCO在([Gent]、[Angouleme]、[ISS]、[Gerona])中的总和(重量)为p

使用条件聚合:

select left(WCDATETIME, 10) as Date, wcco,
       sum(case when WCMCU = 120001 and WCDRYER <> 'G' then cast(WCNETT as decimal) end),
       sum(case when WCMCU = 120001 and WCDRYER = 'G' then cast(WCNETT as decimal) end),
       sum(case when WCMCU = 140001 and WCDRYER <> 'G' then cast(WCNETT as decimal) end),
       sum(case when WCMCU = 140001 and WCDRYER = 'G' then cast(WCNETT as decimal) end),
       . . .
from [DSIMEPPD].dbo.[DARPD.MEP0000]
where WCDATETIME between @Date1 and @Date2
group by left(WCDATETIME, 10), WCCO ;
选择左侧(WCDATETIME,10)作为日期,wcco,
总和(当WCMCU=120001且WCMCU为“G”时的情况,然后转换(WCNETT为十进制)结束),
求和(当WCMCU=120001,WCDREER=G,然后转换(WCNETT为十进制)结束时的情况),
求和(当WCMCU=140001且WCMCU为“G”时,则将其转换(WCNETT为十进制)结束),
求和(当WCMCU=140001且WCDREER=G时的情况),然后转换(WCNETT为十进制)结束,
. . .
来自[DSIMEPPD].dbo.[DARPD.MEP0000]
其中,WCDATETIME介于@Date1和@Date2之间
左分组(WCDATETIME,10),WCCO;
我发现您的数据/时间计算有问题。不应将日期/时间值存储为字符串。如果该值正确存储为
datetime
,则使用
convert(date,WCDATETIME)
转换为日期

解决方案:

select Date,isnull([Gent A],0)as [Gent A],isnull([Gent B],0)as [Gent B],
isnull([Gent A],0)+isnull([Gent B],0) as [Gent],isnull([Angouleme Peptan],0) as [Angouleme Peptan],
isnull([Angouleme Gelatin],0) as [Angouleme Gelatin],isnull([ISS],0) as [ISS],
isnull([Gerona],0) as [Gerona],isnull([Gent A],0)+
isnull([Gent B],0)+isnull([Angouleme Peptan],0)+isnull([Angouleme Gelatin],0)
+isnull([ISS],0)+isnull([Gerona],0) as [TOTAAL] 
FROM (
  SELECT case when WCCO = '00120' and WCDRYER = 'A' then 'Gent A'
         when WCCO = '00120' and WCDRYER = 'B' then 'Gent B'
         when WCCO = '00140' and WCDRYER = 'G' then 'Angouleme Peptan'
         when WCCO = '00140' and WCDRYER <> 'G' then 'Angouleme Gelatin'
         when WCCO = '00150' then 'ISS'
         when WCCO = '00160' then 'Gerona'
   end as WCCO,
   left(WCDATETIME,10) as Date,
   sum(cast(WCNETT as decimal)) as Weight 
   from  [DSIMEPPD].dbo.[DARPD.MEP0000] 
   where (WCMCU=120001 or WCMCU=140001 or WCMCU=150001 or WCMCU=160001 
   or WCMCU=170001) and WCDRYER<>'' 
   and WCDATETIME between @Date1 and @Date2
   group by WCCO, WCDRYER, left(WCDATETIME,10) with rollup
   )t 
   PIVOT (sum(Weight) For WCCO in ([Gent A],[Gent B],[Angouleme Peptan],
   [Angouleme Gelatin],[ISS],[Gerona])) AS p
选择日期,isnull([Gent A],0)作为[Gent A],isnull([Gent B],0)作为[Gent B],
isnull([Gent A],0)+isnull([Gent B],0)作为[Gent],isnull([Angoleme Peptan],0)作为[Angoleme Peptan],
isnull([Angouleme明胶],0)作为[Angouleme明胶],isnull([ISS],0)作为[ISS],
isnull([Gerona],0)作为[Gerona],isnull([genta],0)+
isnull([Gent B],0)+isnull([Angouleme Peptan],0)+isnull([Angouleme明胶],0)
+isnull([ISS],0)+isnull([Gerona],0)作为[TOTAAL]
从(
选择WCCO='00120'和WCDREER='A'时的案例,然后选择'A'
当WCCO='00120'和WCDREER='B'时,则为'Gent B'
当WCCO='00140'和WCDREER='G'时,则为'Angouleme Peptan'
当WCCO='00140'和WCG'G'时,则为'Angouleme明胶'
当WCCO='00150'时,则为'ISS'
当WCCO='00160'时,则为'Gerona'
以WCCO结束,