案例sql不起作用

案例sql不起作用,sql,group-by,case,exists,Sql,Group By,Case,Exists,我有一个select语句,我正试图为报告制作一个select语句。我让它提取数据和我需要的所有东西,但我注意到,由于我必须使用group by,它正在删除表中不存在的行。我怎样才能阻止它或使它工作 SELECT Sum(CASE WHEN direction = 'I' THEN 1 ELSE 0 END) InBound, Sum(CASE WHEN direction = 'O' THEN 1 ELSE 0 END) OutBound, Sum(CASE WH

我有一个select语句,我正试图为报告制作一个select语句。我让它提取数据和我需要的所有东西,但我注意到,由于我必须使用group by,它正在删除表中不存在的行。我怎样才能阻止它或使它工作

SELECT Sum(CASE WHEN direction = 'I' THEN 1 ELSE 0 END) InBound, 
       Sum(CASE WHEN direction = 'O' THEN 1 ELSE 0 END) OutBound, 
       Sum(CASE WHEN direction = 'I' THEN p.duration ELSE 0 END) InBoundTime, 
       Sum(CASE WHEN direction = 'O' THEN p.duration ELSE 0 END) OutBoundTime, 
       u.fullname, 
       ( CASE 
           WHEN EXISTS (SELECT g.goalamount 
                        FROM   [tblbrokergoals] AS g 
                        WHERE  ( g.goaldate BETWEEN 
                                 '2016-03-21' AND '2016-03-27' )) 
         THEN 
           g.goalamount 
           ELSE 0 
         END )  AS GoalAmount 
FROM   [tblphonelogs] AS p 
       LEFT JOIN [tblusers] AS u 
              ON u.fullname = p.phonename 
       LEFT OUTER JOIN [tblbrokergoals] AS g 
                    ON u.fullname = g.brokername 
WHERE  ( calldatetime BETWEEN '2016-03-21' AND '2016-03-27' ) 
       AND ( u.userid IS NOT NULL ) 
       AND ( u.direxclude <> '11' ) 
       AND u.termdate IS NULL 
       AND ( g.goaldate BETWEEN '2016-03-21' AND '2016-03-27' ) 
GROUP  BY u.fullname, 
          g.goalamount; 
当用户在BrokerGoals中时,它会工作并获取所有数据,但当用户不在BrokerGoals中时,它只会删除返回结果集中的那一行。当用户在brokergoals表中不存在以将该值设置为0或-因此该行不会被删除时,如何获得该值。

如果您有一个brokers表,则可以将其用于左联接

如果你的经纪人有重复的名字,那么使用

SELECT b.broker_id, ....
FROM (SELECT DISTINCT broker_id
      FROM brokers) b
LEFT JOIN .... ALL YOUR OTHER TABLES
....
GROUP BY b.broker_id,   ....

这就是我最终解决问题的方法。我添加了Case When Exists语句,然后在then语句中选择了else it is 0。

是否尝试替换Case 存在时,选择g.goalamount 来自[tblbrokergoals]作为g g.goaldate在哪里 “2016-03-21”和“2016-03-27” 然后 g、 戈拉蒙特 其他0 以GoalAmount结束
只需g.goalamount,因为where子句中已经有了日期条件,问题是您需要一个传统的左连接。几分钟前我刚刚回答了几乎完全相同的问题。如果我没有权限在数据库中创建新表,请告诉我。有时用户在brokergoals中有时不取决于他们是否在办公室,但如果他们在brokergoals中没有值,则仍应显示0。这也是我更改的内容,它仍在删除brokergoals表中不存在代理的行,因为组byI结束在select case语句中修复它时,我必须先生成select语句,然后将else设置为0,这样它才能工作。然后,错误就出现在其他地方。正如我所说的另一个问题,删除select上的agregations,只使用与GROUP BY相同的值,您将看到行不在那里
SELECT b.broker_id, ....
FROM (SELECT DISTINCT broker_id
      FROM brokers) b
LEFT JOIN .... ALL YOUR OTHER TABLES
....
GROUP BY b.broker_id,   ....
SELECT u.FullName,
    SUM(CASE WHEN Direction = 'I' THEN 1 ELSE 0 END) AS InBound,
    SUM(CASE WHEN Direction = 'O' THEN 1 ELSE 0 END) OutBound,
    SUM(CASE WHEN Direction = 'I' THEN p.Duration ELSE 0 END) InBoundTime,
    SUM(CASE WHEN Direction = 'O' THEN p.Duration ELSE 0 END) OutBoundTime,
    CASE WHEN EXISTS (
        SELECT g.GoalAmount
        FROM [Portal].[dbo].[tblBrokerGoals] AS g
        WHERE g.GoalDate BETWEEN '2016-03-21' AND '2016-03-27'
            AND u.FullName = g.BrokerName
    ) THEN (
        SELECT g.GoalAmount
        FROM [Portal].[dbo].[tblBrokerGoals] AS g
        WHERE g.GoalDate BETWEEN '2016-03-21' AND '2016-03-27'
            AND u.FullName = g.BrokerName
    ) ELSE '0' END AS GoalAmount
FROM [Portal].[dbo].[tblUsers] AS u
LEFT JOIN [Portal].[dbo].[tblPhoneLogs] AS p
    ON u.FullName = p.PhoneName
WHERE u.UserID IS NOT NULL
    AND u.DirExclude <> '11'
    AND u.TermDate IS NULL
    AND p.CallDateTime BETWEEN '2016-03-21' AND '2016-03-27'
GROUP BY u.FullName