【问题标题】:Case sql not working案例sql不工作
【发布时间】:2016-03-30 18:47:15
【问题描述】:

我有一个选择语句,我正试图为报告做出选择。我有它提取数据和我需要的一切,但我注意到,因为我必须使用组,所以它会丢弃表中不存在的行。我怎样才能阻止它或使它起作用。

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 表中不存在用户将该值设置为 0 或 -- 所以该行不会被删除时,我该如何获取它。

【问题讨论】:

  • 问题是你需要一个额外的LEFT JOIN。我只是在几分钟前回答了几乎完全相同的问题。让我知道是否有帮助stackoverflow.com/a/36317252/3470178
  • 我没有在数据库中创建新表的权限。有时用户在经纪人目标中,有时他们不取决于他们是否在办公室,但如果他们在经纪人目标中没有价值,它仍然应该显示 0。

标签: sql group-by case exists


【解决方案1】:

如果您有一个brokers 表,那么您可以将它用于您的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,   ....

【讨论】:

  • 这也是我改变它的地方,它仍然摆脱了brokergoals表中由于group by而不存在代理的行
  • 我最终在 select case 语句中修复了它,我还必须做出 then select 语句,else 为 0 才能正常工作。
  • 那么错误在其他地方。正如我所说的另一个问题,删除选择上的聚合并使用与GROUP BY 相同的值,您将看到行不存在
【解决方案2】:
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 语句中选择 else 它为 0。

【讨论】:

    【解决方案3】:

    您是否尝试过替换(CASE 当存在时(选择 g.goalamount FROM [tblbrokergoals] AS g WHERE ( g.goaldate BETWEEN '2016-03-21' 和 '2016-03-27' )) 然后 g.目标金额 否则 0 END ) 作为目标金额 只是 g.goalamount,因为您在 where 子句中已经有了该日期条件

    【讨论】:

      猜你喜欢
      • 2012-08-28
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-29
      相关资源
      最近更新 更多