Sql 每个类别的小计未显示数据(所有小计列显示空值)

Sql 每个类别的小计未显示数据(所有小计列显示空值),sql,Sql,在我的问题中,我还有最后一个要克服的障碍。我的目标是按指定类别(“prodcat”)对产品(“prod”)进行分组,并在每个类别末尾对每列数据(如1月、2月等)进行小计 下面我提供了一个数据图片的链接。它显示了每个相关列/类别(B/O、手头、提交、[Tot Avail]、1月、3月、4月、5月、6月、7月、8月、9月、10月、11月和12月)和一个名为“小计-产品目录”的新行。正如我所说,与每个prodcat相关的数据需要在每个类别的末尾进行小计。正如您将在图中看到的,虽然我在每个prodcat

在我的问题中,我还有最后一个要克服的障碍。我的目标是按指定类别(“prodcat”)对产品(“prod”)进行分组,并在每个类别末尾对每列数据(如1月、2月等)进行小计

下面我提供了一个数据图片的链接。它显示了每个相关列/类别(B/O、手头、提交、[Tot Avail]、1月、3月、4月、5月、6月、7月、8月、9月、10月、11月和12月)和一个名为“小计-产品目录”的新行。正如我所说,与每个prodcat相关的数据需要在每个类别的末尾进行小计。正如您将在图中看到的,虽然我在每个prodcat的末尾显示了“Subtotal-[prodcat]”,但该行的每列数据值都为空。我删除了prod名称和prodcat名称,但您仍然应该清楚地看到我面临的问题

我似乎不知道我做错了什么。我尝试过使用CASE-WHEN、GROUPING-SET、ROLLUP等,并且已经成功了。出于某种原因,到目前为止,我所做的任何尝试都不允许[subtotals-prodcat]行(以及subtotal-total)具有实际值,而不仅仅是NULL

下面,我继续使用SQLFiddle来“重新创建”我要做的事情。代码在虚拟数据之外是相同的。我以前从未使用过SQL FIDLE,所以希望我的文章是正确的。我要说的一件事是,SQLFiddle不允许您“创建视图”。然而,我在我的过程中使用了一个“视图”,因此我在下面包含了用于测试目的的代码,并准确地显示了我用于获得结果的方法

CREATE TABLE icsw (
    prod varchar(88) not null,
    vendprod varchar(48) null,
    qtyonhand decimal(17,2) null,
    qtycommit decimal(17,2) null,
    cono int not null,
    statustype varchar(42) null,
    whse varchar(48) not null,
    PRIMARY KEY (prod, cono, whse)
  );
  
  CREATE TABLE smsw (
    componentfl bit(1) not null,
    cono int not null,
    prod varchar(88),
    whse varchar(88) not null,
    yr int not null,
    qtysold varchar(404) null,
    insx bit null,
    PRIMARY KEY (componentfl, cono, prod, whse, yr)
   );
  
  CREATE TABLE icsp (
    prod varchar(88) not null,
    prodcat varchar(48) null,
    kittype varchar(48) null,
    cono int not null,
    PRIMARY KEY (prod, cono)
  );
  
    INSERT INTO icsp
    (`prod`, `prodcat`, `kittype`, `cono`)
VALUES
    ('0201 0495 0135', 'RP', 'NULL', '1'),
    ('0202 0595 1135', 'TP', 'NULL', '1'),
    ('0203 1595 2135', 'LC', 'B', '1'),
    ('0204 7547 2435', 'LC', 'P', '1'),
    ('playstation 5', 'BATT', 'NULL', '1'),
    ('playstation 4', 'BATT', 'NULL', '1'),
    ('playstation 3', 'BATT', 'NULL', '1'),
    ('playstation 2', 'BATT', 'NULL', '1'),
    ('xbox 360', 'BATT', 'NULL', '1'),
    ('xbox One', 'BATT', 'NULL', '1'),
    ('Zeus Battery Backup', 'BATT', 'NULL', '1'),
    ('N64', 'BATTN', 'NULL', '1'),
    ('Super Nintendo', 'BATTN', 'NULL', '1'),
    ('Super Nintendo KIT', 'BATTN', 'B', '1'),
    ('Backlight', 'LB', 'NULL', '1'),
    ('Dell Custom Laptop 1', 'AB50', 'P', '1'), 
    ('Dell Custom Laptop KIT', 'AB50', 'P', '1'),
    ('Run from Zombies Training Course', 'PT', 'NULL', '1'),
    ('Run from BOSS MUSIC Training Course', 'PT', 'NULL', '1'),
    ('Dont say anything crazy Training Course', 'PR', 'NULL', '1'),
    ('New York Yankees Spring Training Schedule', 'PR', 'NULL', '0')
;

  INSERT INTO smsw
    (`componentfl`, `cono`, `prod`, `whse`, `yr`, `qtysold`, `insx`)
VALUES
    (0, '1', '0201 0495 0135', 'NY', '98', '102;114;132;23;37;39;13;36;16;10;0;0;0', 1),
    (0, '1', '0202 0595 1135', 'NY', '99', '-3;0;1;0;0;3;0;0;0;0;0;0;0', 1),
    (0, '1', '0203 1595 2135', 'NY', '1', '1;4;1;0;1;3;0;3;0;1;0;0;0', 1),
    (0, '1', '0204 7547 2435', 'NY', '20', '0;8;0;1;4;0;0;1;0;0;0;0;0', 1),
    (0, '1', 'playstation 5', '', '20', '44;31;31;52;39;50;46;37;0;0;0;0;0', 1),
    (0, '1', 'playstation 4', '', '20', '39;78;37;21;20;24;78;28;40;14;0;0;0', 1),
    (0, '1', 'playstation 3', '', '20', '72;54;63;43;61;49;37;48;19;22;0;0;0', 1),
    (0, '1', 'playstation 2', '', '99', '176;190;164;164;160;212;231;137;163;81;0;0;0', 1),
    (0, '1', 'xbox 360', '', '20', '41;28;31;35;73;57;67;49;46;32;0;0;0', 1),
    (0, '1', 'xbox One', '', '20', '0;0;2;2;6;10;5;4;3;0;0;0;0', 1),
    (0, '1', 'Zeus Battery Backup', '', '20', '0;0;5;7;15;10;25;14;33;0;0;0;0', 1),
    (0, '1', 'N64', '', '96', '60;24;26;35;73;72;43;27;34;28;0;0;0', 1),
    (0, '1', 'Super Nintendo', '', '93', '64;49;45;70;94;88;71;89;118;51;0;0;0', 1),
    (1, '1', 'Super Nintendo KIT', '', '95', '2;0;0;0;2;0;1;4;1;5;0;0;0', 1),
    (1, '1', 'Backlight', 'NY', '95', '4;1;3;6;1;6;2;6;3;4;0;0;0', 1),
    (0, '1', 'Dell Custom Laptop 1', 'NY', '20', '82;36;38;51;62;34;63;84;56;40;0;0;0', 1), 
    (1, '1', 'Dell Custom Laptop 1 KIT', 'NY', '20', '13;0;20;36;0;0;0;0;0;0;0;0;0', 1),
    (0, '1', 'Run from Zombies Training Course', 'NY', '20', '32;0;45;125;8;45;28;53;-11;30;0;0;0', 1),
    (0, '1', 'Run from BOSS MUSIC Training Course', 'NY', '80', '11;26;9;6;5;21;23;6;25;1;0;0;0', 1),
    (0, '1', 'Dont say anything crazy Training Course', 'NY', '20', '14;36;11;5;7;20;3;6;22;2;0;0;0', 1),
    (0, '0', 'New York Yankees Spring Training Schedule', 'NY', '20', '0;0;0;0;0;0;0;0;0;0;2000;0;0', 1)
;

 INSERT INTO icsw
    (`cono`, `prod`, `vendprod`, `qtyonhand`, `qtycommit`, `statustype`, `whse`)
VALUES
    ('1', '0201 0495 0135', '26971239847', '0.00', '0.00', 's','NY'),
    ('1', '0202 0595 1135', '38137234999', '14.00', '0.00', 's', 'NY'),
    ('1', '0203 1595 2135', '38137234999', '7.00', '2.00', 's', 'NY'),
    ('1', '0204 7547 2435', '38137234999', '3.00', '0.00', 's', 'NY'),
    ('1', 'playstation 5', '73293687625', '0.00', '0.00', 'x', 'NY'),
    ('1', 'playstation 4', '73293687625', '10000.00', '5000.00', 'd', 'NY'),
    ('1', 'playstation 3', '73293687625', '100.00', '50.00', 'd', 'NY'),
    ('1', 'playstation 2', '73293687625', '50.00', '5.00', 'd', 'NY'),
    ('1', 'xbox 360', '39009685421', '5000.00', '500.00', 's', 'NY'),
    ('1', 'xbox One', '39009685421', '2500.00', '250.00', 's',  'NY'),
    ('1', 'Zeus Battery Backup', '25676854322', '5.00', '2.00', 'x',  'Atlanta'),
    ('1', 'N64', '76655443322', '50.00', '10.00', 'd', 'NY'),
    ('1', 'Super Nintendo', '76655443322', '25.00', '12.00', 's', 'NY'),
    ('1', 'Super Nintendo KIT', '76655443322', '15.00', '5.00', 's','NY'),
    ('1', 'Backlight', '95395843294', '2500.00', '0.00', 'x', 'Atlanta'),
    ('1', 'Dell Custom Laptop 1', '39586749320', '52.00', '27.00', 's', 'NY'), 
    ('1', 'Dell Custom Laptop 1 KIT', '39586749320', '27.00', '10.00', 's', 'NY'),
    ('1', 'Run from Zombies Training Course', '12345678912', '500000.00', '20000.00', 'x', 'NY'),
    ('1', 'Run from BOSS MUSIC Training Course', '12345678912', '1111115.00', '25678.00', 'x', 'NY'),
    ('1', 'Dont say anything crazy Training Course', '12345678912', '9999999.00', '6666666.00', 'x', 'NY'),
    ('0', 'New York Yankees Spring Training Schedule', '55555555555', '9999.00', '66.00', 'x', 'NY')
;

CREATE VIEW dbo.Report 
AS
SELECT icsw.prod, icsw.vendprod, icsw.qtybo, icsw.qtyonhand, icsw.qtycommit, icsw.qtyonhand - icsw.qtycommit AS TotAvail, 
Split(smsw.qtysold, 1, ';') AS JAN, Split(smsw.qtysold, 2, ';') AS FEB, Split(smsw.qtysold, 3, ';') AS MAR, Split(smsw.qtysold, 4, ';') AS APR, Split(smsw.qtysold, 5, ';') AS MAY, Split(smsw.qtysold, 
6, ';') AS JUN, Split(smsw.qtysold, 7, ';') AS JUL, Split(smsw.qtysold, 8, ';') AS AUG, Split(smsw.qtysold, 9, ';') AS SEP, Split(smsw.qtysold, 10, ';') AS OCT, 
Split(smsw.qtysold, 11, ';') AS NOV, Split(smsw.qtysold, 12, ';') AS 'DEC', icsp.kittype, icsp.prodcat, icsw.cono, smsw.componentfl
FROM icsw LEFT OUTER JOIN
     icsp ON icsp.prod = icsw.prod LEFT OUTER JOIN
     smsw ON icsp.prod = smsw.prod
WHERE        (icsp.cono = 1) AND (icsp.prodcat = 'TL' OR
                         icsp.prodcat = 'AS' OR
                         icsp.prodcat = 'RP' OR
                         icsp.prodcat = 'TP' OR
                         icsp.prodcat = 'LC' OR
                         icsp.prodcat = 'LC' OR
                         icsp.prodcat = 'BATT' OR
                         icsp.prodcat = 'BATTN' OR
                         icsp.prodcat = 'LB' OR
                         icsp.prodcat = 'AB50' OR
                         icsp.prodcat = 'PT' OR
                         icsp.prodcat = 'PR') AND (icsp.kittype IS NULL) AND (icsw.whse = 'NY') AND (icsw.statustype = 's' OR
                         icsw.statustype = 'd' OR
                         icsw.statustype = 'x') AND (smsw.yr = 20)
GROUP BY icsw.prod, icsw.vendprod, icsw.qtybo, icsw.qtyonhand, icsw.qtycommit, icsp.kittype, icsp.prodcat, smsw.componentfl, smsw.qtysold, icsw.cono
ORDER BY icsp.prodcat, icsw.prod;
以下是我在设置数据库/表/视图后运行的查询:

 SELECT    prod
          ,[prodcat] = CASE 
            WHEN prod IS NULL THEN 
                '[Subtotal - ' + COALESCE(prodcat, 'Overall') + ']' 
            ELSE prodcat
            END
          ,[vendprod] As 'Vendor #'
          ,[qtybo] AS 'B/O'
          ,[qtyonhand] AS 'On Hand'
          ,[qtycommit] ' Commit'
          ,TotAvail
          ,[JAN]
          ,[FEB]
          ,[MAR]
          ,[APR]
          ,[MAY]
          ,[JUN]
          ,[JUL]
          ,[AUG]
          ,[SEP]
          ,[OCT]
          ,[NOV]
          ,[DEC]
      FROM
        (SELECT 
          [prod]
          ,[vendprod]
          ,[qtybo]
          ,[qtyonhand]
          ,[qtycommit]
          ,TotAvail
          ,SUM(CAST(JAN AS int)) over (PARTITION BY prod) AS JAN
          ,SUM(CAST(FEB AS int)) over (PARTITION BY prod) AS FEB
          ,SUM(CAST(MAR AS int)) over (PARTITION BY prod) AS MAR
          ,SUM(CAST(APR AS int)) over (PARTITION BY prod) AS APR
          ,SUM(CAST(MAY AS int)) over (PARTITION BY prod) AS MAY
          ,SUM(CAST(JUN AS int)) over (PARTITION BY prod) AS JUN
          ,SUM(CAST(JUL AS int)) over (PARTITION BY prod) AS JUL
          ,SUM(CAST(AUG AS int)) over (PARTITION BY prod) AS AUG
          ,SUM(CAST(SEP AS int)) over (PARTITION BY prod) AS SEP
          ,SUM(CAST(OCT AS int)) over (PARTITION BY prod) AS OCT
          ,SUM(CAST(NOV AS int)) over (PARTITION BY prod) AS NOV
          ,SUM(CAST(DEC AS int)) over (PARTITION BY prod) AS 'DEC'
          ,CAST(ROW_NUMBER() OVER (PARTITION BY prod ORDER BY prod) AS INT) count
          ,prodcat
      FROM [dbo].[Report])  AS sub
      where count = 1 AND prodcat is not null
      GROUP BY ROLLUP ((prodcat), (prod, vendprod, qtybo, qtyonhand, qtycommit, TotAvail, JAN, FEB, MAR,[APR],[MAY],[JUN],[JUL],[AUG],[SEP],[OCT],[NOV],[DEC])) 
如果您发现我的代码不起作用,我很乐意自己运行另一个测试,使用上述信息“创建”另一个/新的DB,然后重新运行代码


希望有人能帮我弄明白为什么小计行只显示空。

我弄明白了。这只是我必须做的一个简单的总数。我把它复杂化了。对于我想作为小计一部分的任何列,我只需要使用sum

当我像下面那样做时:

   sum([qtybo]) AS 'B/O'
  ,sum([qtyonhand]) AS 'On Hand'
  ,sum([qtycommit]) AS ' Commit'
  ,sum([Tot Avail]) AS [Tot Avail]
  ,sum([JAN]) AS JAN
  ,sum([FEB]) AS FEB
  ,sum([MAR]) AS MAR
  ,sum([APR]) AS APR
  ,sum([MAY]) AS MAY
  ,sum([JUN]) AS JUN
  ,sum([JUL]) AS JUL
  ,sum([AUG]) AS AUG
  ,sum([SEP]) AS SEP
  ,sum([OCT]) AS OCT
  ,sum([NOV]) AS NOV
  ,sum([DEC]) AS 'DEC'
小计和总总计填充了我要查找的数据