Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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_Tsql - Fatal编程技术网

Sql 两个求和查询在一起

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

我有一个表“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 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