首页 > 解决方案 > 基于事务的 SQL 分析

问题描述

我有以下 SQL 表:

1. ItemLevel 表

SiteID   BusinessDate   ItemName   UnitsSold   UnitsSale   ItemNo  OrderNo
----------------------------------------------------------------------------
1        16/05/2019     Beef         1             5        10001    122-1
1        16/05/2019     Chicken      9             18       10002    122-1

1        16/05/2019     Beef         2             5        10001    122-4
1        16/05/2019     Chicken      2             6        10002    122-4
1        16/05/2019     Beans        4             8        10004    122-4

2        16/05/2019     Beef         2             5        10001    122-2
2        16/05/2019     Chicken      1             6        10002    122-2

3        16/05/2019     Bread        3             5        10003    122-3
3        16/05/2019     Beans        7             17       10004    122-3

2.主项目表

ItemNo    FullName   MenuCategory 
---------------------------------
10001       Beef      Group1    
10002       Chicken   Group1  
10003       Bread     Group2   
10004       Beans     Group2   
10005       Orange    Group3 

预期结果

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

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

示例:我们正在检查每个订单有多少牛肉项目(售出的单位)与牛肉或鸡肉(Group1)一起,其他列(oldwithGroup2,SoldwithGroup3)也是如此

我们在 SoldwithGroup1 栏下售出了 5 个单位,因为我们检查了与牛肉本身(因为同一项目属于同一类别)或与订单号(122-1、122-4 和 122- 2)。

标签: sqlsql-serverplsqlsql-server-2012

解决方案


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

也就是说,对于每件商品,按组查看以同一订单出售的其他商品的数量确实有意义。我怀疑这就是你想要的。

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

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

推荐阅读