Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于事务的SQL分析_Sql_Sql Server_Plsql_Sql Server 2012 - Fatal编程技术网

基于事务的SQL分析

基于事务的SQL分析,sql,sql-server,plsql,sql-server-2012,Sql,Sql Server,Plsql,Sql Server 2012,我有以下SQL表: 一,。项目级表 二,。主项目表 预期结果 根据以上结果,我们将主菜单项表中的所有菜单项按行列出,并根据不同类别检查每个菜单项,以获得售出的总单位 示例:我们正在检查每个订单中与牛肉或鸡肉组1以及其他列oldwithGroup2、SoldwithGroup3一起出售的牛肉项目的数量 我们在SoldwithGroup1列下销售了5个单位,因为我们检查了牛肉项目10001,因为同一项目属于同一类别,或者鸡肉与订单号122-1、122-4和122-2匹配 您的问题很难理解,因为这些值

我有以下SQL表:

一,。项目级表

二,。主项目表

预期结果

根据以上结果,我们将主菜单项表中的所有菜单项按行列出,并根据不同类别检查每个菜单项,以获得售出的总单位

示例:我们正在检查每个订单中与牛肉或鸡肉组1以及其他列oldwithGroup2、SoldwithGroup3一起出售的牛肉项目的数量


我们在SoldwithGroup1列下销售了5个单位,因为我们检查了牛肉项目10001,因为同一项目属于同一类别,或者鸡肉与订单号122-1、122-4和122-2匹配

您的问题很难理解,因为这些值在结果集中不会相加

也就是说,对于每一件商品,按组查看同一顺序销售的其他商品的数量是有意义的。我想这就是你想要的

这是一个相当复杂的自连接:

with ilg as (
      select il.*, mi.group
      from itemlevel il join
           materitem mi
           on il.itemno = mi.itemno
     )
select mi.itemno, mi.fullname, mi.MenuCategory,
       sum(case when ilg2.MenuCategory = 'Group1' then ilg2.unitssold end) as group1,
       sum(case when ilg2.MenuCategory = 'Group2' then ilg2.unitssold end) as group2,
       sum(case when ilg2.MenuCategory = 'Group3' then ilg2.unitssold end) as group3
from masteritems mi left join
     ilg
     on mi.itemno = ilg.itemno left join
     ilg ilg2
     on ilg.orderno = ilg2.orderno and ilg.itemno <> ilg2.itemno
group by mi.itemno, mi.fullname, mi.MenuCategory

这里有一个方法,首先计算同一订单中每个菜单类别的销售单位

然后根据菜单类别,使用该值对UNITSOLD进行条件求和

SELECT ItemNo, FullName, MenuCategory,
 SUM(CASE WHEN MenuCategory = 'Group1' AND Grp1 > UnitsSold THEN UnitsSold WHEN MenuCategory != 'Group1' AND Grp1 > 0 THEN UnitsSold ELSE 0 END) AS SoldWithGroup1,
 SUM(CASE WHEN MenuCategory = 'Group2' AND Grp2 > UnitsSold THEN UnitsSold WHEN MenuCategory != 'Group2' AND Grp2 > 0 THEN UnitsSold ELSE 0 END) AS SoldWithGroup2,
 SUM(CASE WHEN MenuCategory = 'Group3' AND Grp3 > UnitsSold THEN UnitsSold WHEN MenuCategory != 'Group3' AND Grp3 > 0 THEN UnitsSold ELSE 0 END) AS SoldWithGroup3
FROM
(
    SELECT l.OrderNo, itm.ItemNo, itm.FullName, itm.MenuCategory, l.UnitsSold,
    SUM(CASE WHEN itm.MenuCategory = 'Group1' THEN l.UnitsSold ELSE 0 END) OVER (PARTITION BY l.OrderNo) AS Grp1,
    SUM(CASE WHEN itm.MenuCategory = 'Group2' THEN l.UnitsSold ELSE 0 END) OVER (PARTITION BY l.OrderNo) AS Grp2,
    SUM(CASE WHEN itm.MenuCategory = 'Group3' THEN l.UnitsSold ELSE 0 END) OVER (PARTITION BY l.OrderNo) AS Grp3
    FROM Item itm
    LEFT JOIN ItemLevel l ON l.ItemNo = itm.ItemNo
) q
GROUP BY ItemNo, FullName, MenuCategory
ORDER BY ItemNo;

在rextester上进行测试

结果表中的数字似乎与原始数据无关,这使得我们很难理解其中的逻辑。@GordonLinoff我们在SoldwithGroup1列下卖出了5个单位,因为我们检查了牛肉项目10001,因为同一项目属于同一类别,或者鸡肉符合订单122-1,122-4和122-2.在colmun Group 1的产量中,我不想计算Group 1下售出的牛肉数量,而是应该将Group 1的牛肉总量相加
ItemNo    FullName   MenuCategory    SoldwithGroup1     SoldwithGroup2   SoldwithGroup3
-----------------------------------------------------------------------------------------------
10001       Beef      Group1            5                    2                  0
10002       Chicken   Group1            12                   2                  0
10003       Bread     Group2            0                    3                  0                  
10004       Beans     Group2            4                    7                  0
10005       Orange    Group3            0                    0                  0
with ilg as (
      select il.*, mi.group
      from itemlevel il join
           materitem mi
           on il.itemno = mi.itemno
     )
select mi.itemno, mi.fullname, mi.MenuCategory,
       sum(case when ilg2.MenuCategory = 'Group1' then ilg2.unitssold end) as group1,
       sum(case when ilg2.MenuCategory = 'Group2' then ilg2.unitssold end) as group2,
       sum(case when ilg2.MenuCategory = 'Group3' then ilg2.unitssold end) as group3
from masteritems mi left join
     ilg
     on mi.itemno = ilg.itemno left join
     ilg ilg2
     on ilg.orderno = ilg2.orderno and ilg.itemno <> ilg2.itemno
group by mi.itemno, mi.fullname, mi.MenuCategory
SELECT ItemNo, FullName, MenuCategory,
 SUM(CASE WHEN MenuCategory = 'Group1' AND Grp1 > UnitsSold THEN UnitsSold WHEN MenuCategory != 'Group1' AND Grp1 > 0 THEN UnitsSold ELSE 0 END) AS SoldWithGroup1,
 SUM(CASE WHEN MenuCategory = 'Group2' AND Grp2 > UnitsSold THEN UnitsSold WHEN MenuCategory != 'Group2' AND Grp2 > 0 THEN UnitsSold ELSE 0 END) AS SoldWithGroup2,
 SUM(CASE WHEN MenuCategory = 'Group3' AND Grp3 > UnitsSold THEN UnitsSold WHEN MenuCategory != 'Group3' AND Grp3 > 0 THEN UnitsSold ELSE 0 END) AS SoldWithGroup3
FROM
(
    SELECT l.OrderNo, itm.ItemNo, itm.FullName, itm.MenuCategory, l.UnitsSold,
    SUM(CASE WHEN itm.MenuCategory = 'Group1' THEN l.UnitsSold ELSE 0 END) OVER (PARTITION BY l.OrderNo) AS Grp1,
    SUM(CASE WHEN itm.MenuCategory = 'Group2' THEN l.UnitsSold ELSE 0 END) OVER (PARTITION BY l.OrderNo) AS Grp2,
    SUM(CASE WHEN itm.MenuCategory = 'Group3' THEN l.UnitsSold ELSE 0 END) OVER (PARTITION BY l.OrderNo) AS Grp3
    FROM Item itm
    LEFT JOIN ItemLevel l ON l.ItemNo = itm.ItemNo
) q
GROUP BY ItemNo, FullName, MenuCategory
ORDER BY ItemNo;