基于事务的SQL分析
我有以下SQL表: 一,。项目级表 二,。主项目表 预期结果 根据以上结果,我们将主菜单项表中的所有菜单项按行列出,并根据不同类别检查每个菜单项,以获得售出的总单位 示例:我们正在检查每个订单中与牛肉或鸡肉组1以及其他列oldwithGroup2、SoldwithGroup3一起出售的牛肉项目的数量基于事务的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匹配 您的问题很难理解,因为这些值
我们在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;