案例 sql 不工作

Case sql not working

我有一个 select 声明,我想为报告做准备。我有它提取数据和我需要的一切,但我注意到,因为我必须使用组,它正在丢弃 table 中不存在的行。我怎样才能阻止它或让它工作。

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 table 中时,我如何才能将其设置为 0 或 - 因此该行不会被删除。

如果您有 brokers table 那么您可以将它用于您的 left join

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

如果您的经纪人有重名,请使用

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

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

您是否尝试过替换 ( CASE 当存在时(SELECT g.goalamount 来自 [tblbrokergoals] AS g 其中 ( g.goaldate 之间 '2016-03-21' 和 '2016-03-27' )) 然后 g.goalamount 其他 0 END ) 作为目标金额 只是 g.goalamount,因为您已经在 where 子句

中有了那个日期条件