Sql 两个求和查询在一起
我有一个表“Events”和一个表“Slots”,其中Slots.SlotID=Events.MainSlot或Events.extraclot 我需要计算每个时段的“与会者”人数(主时段和外时段-外时段可选)Sql 两个求和查询在一起,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个表“Events”和一个表“Slots”,其中Slots.SlotID=Events.MainSlot或Events.extraclot 我需要计算每个时段的“与会者”人数(主时段和外时段-外时段可选) 表“事件” 表“插槽” 如果我单独查询数据库,如下所示: SELECT s.Slot, s.SlotID, ISNULL(SUM(e. Attendees), 0) AS Attendees1 FROM Slots AS s LEFT OUTER
表“事件”
表“插槽”
如果我单独查询数据库,如下所示:
SELECT s.Slot, s.SlotID, ISNULL(SUM(e. Attendees), 0) AS Attendees1
FROM Slots AS s
LEFT OUTER JOIN Events AS e ON e.MainSlot = s.SlotID
GROUP BY s.Slot, s.SlotID
…或:
SELECT s.Slot, s.SlotID, ISNULL(SUM(x.Attendees), 0) AS Attendees2
FROM Slots AS s
LEFT OUTER JOIN Events AS x ON x.ExtraSlot = s.SlotID
GROUP BY s.Slot, s.SlotID
我分别得到以下结果:
SlotID ------ Attendees1
1------------- 40
2------------- 60
3------------- 70
4------------- 0
SlotID ------- Attendees2
1------------- 0
2------------- 0
3------------- 20 *correct
4------------- 70
两个结果都是正确的。但是,如果我把这两个查询放在一起,就会出现如下表所示的错误
SELECT s.Slot, s.SlotID, ISNULL(SUM(e.Attendees), 0) AS Attendees1,
ISNULL(SUM(x. Attendees), 0) AS Attendees2
FROM Slots AS s LEFT OUTER JOIN
Events AS e ON e.MainSlot = s.SlotID LEFT OUTER JOIN
Events AS x ON x.ExtraSlot = s.SlotID
GROUP BY s.Slot, s.SlotID
SlotID------------- Attendees1---------- Attendees2
1-------------------40-------------------0
2-------------------60-------------------0
3-------------------70------------------60 *wrong
4-------------------0-------------------70
我做错了什么?谢谢你的帮助 我的猜测是,这与您在这两个组中都有记录有关。请尝试以下操作(MSSQL服务器)
你加入了两次,所以你会在报税表中得到重复的结果。基本上你得到了这个: slotid…e.主插槽…x.外部插槽…x.与会者…e.与会者 3……….3……….3……….20……….40
3……….3……….3……….20……….20
3……….3……….3……….20……….10
这是预期的行为,因为您要将X从插槽JOIN E连接到每个结果行。为什么不做两个子选择,将这些结果相加。您好,我使用的是SQLServer。詹姆斯,我该怎么做?谢谢你的评论。我会检查我的代码并在找到最佳解决方案后尽快发回。非常感谢!!!
SlotID ------ Attendees1
1------------- 40
2------------- 60
3------------- 70
4------------- 0
SlotID ------- Attendees2
1------------- 0
2------------- 0
3------------- 20 *correct
4------------- 70
SELECT s.Slot, s.SlotID, ISNULL(SUM(e.Attendees), 0) AS Attendees1,
ISNULL(SUM(x. Attendees), 0) AS Attendees2
FROM Slots AS s LEFT OUTER JOIN
Events AS e ON e.MainSlot = s.SlotID LEFT OUTER JOIN
Events AS x ON x.ExtraSlot = s.SlotID
GROUP BY s.Slot, s.SlotID
SlotID------------- Attendees1---------- Attendees2
1-------------------40-------------------0
2-------------------60-------------------0
3-------------------70------------------60 *wrong
4-------------------0-------------------70
SELECT s.Slot, s.SlotID, ISNULL(SUM(e.Attendees), 0) AS Attendees1,
ISNULL(SUM(CASE WHEN x. Attendees IS NULL THEN 0 ELSE x.Attendees END), 0) AS Attendees2
FROM Slots AS s LEFT OUTER JOIN
Events AS e ON e.MainSlot = s.SlotID LEFT OUTER JOIN
Events AS x ON x.ExtraSlot = s.SlotID
GROUP BY s.Slot, s.SlotID
SELECT s.SlotId,
COALESCE(
(
SELECT SUM(attendees)
FROM events ea
WHERE ea.MainSlot = s.SlotId
), 0) AS AttendeesAsMain,
COALESCE(
(
SELECT SUM(attendees)
FROM events ea
WHERE ea.ExtraSlot = s.SlotId
), 0) AS AttendeesAsExtra
FROM Slots s
SELECT a.SlotID, Attendees1, Attendees2 FROM
(SELECT s.Slot, s.SlotID, ISNULL(SUM(e. Attendees), 0) AS Attendees1
FROM Slots AS s
LEFT OUTER JOIN Events AS e ON e.MainSlot = s.SlotID
GROUP BY s.Slot, s.SlotID) as a,
(SELECT s.Slot, s.SlotID, ISNULL(SUM(x.Attendees), 0) AS Attendees2
FROM Slots AS s
LEFT OUTER JOIN Events AS x ON x.ExtraSlot = s.SlotID
GROUP BY s.Slot, s.SlotID) as b
WHERE a.SlotID = b.SlotID