【问题标题】:Need to return a value and its count as 0 when it does not exist with in a range of dates当某个日期范围内不存在时,需要返回一个值并将其计数为 0
【发布时间】:2012-06-01 18:04:17
【问题描述】:

下面是我的确切代码。此查询非常有效,除非在日期范围内不存在 teamid。如果指定的日期范围内不存在 teamid,我希望 SQL 将 teamid 添加到表中并将其计数设置为 0。然后,我的表会自动将 teamid 转换为我的 teamtext。

SELECT tn.teamtext, COUNT(referteamID2) AS cnt
FROM teamnames AS tn
JOIN caseaudit AS ca
ON tn.teamID = ca.referteamID2
WHERE CONVERT(smalldatetime,dModLast,101) BETWEEN '2012-03-01' AND '2012-03-10'
AND ca.referteamid1 <> ca.referteamid2
AND teamid IN (99, 107, 124, 27, 31, 44, 110, 43, 57, 50, 46)
GROUP BY tn.teamtext
ORDER BY tn.teamtext

这会返回:

4H BOSS                59
ASSET MANAGEMENT       16
BOSS                   5
CUSTOMER SUPPORT       133
NETWORK ENGINEERING    15
PRODUCTION ENGINEERING 142
SECURITY               6
VOICE SERVICES         21
XEROX                  8

有人告诉我,这个问题可能与在给出日期限制后使用 IN 有关。

【问题讨论】:

    标签: sql date join constraints


    【解决方案1】:

    将条件从 WHERE 子句移到 SELECT 中的 CASE 语句中:

    SELECT tn.teamtext,
           sum(case when CONVERT(smalldatetime,dModLast,101) BETWEEN '2012-03-01' AND '2012-03-10' 
                    then 1 else 0
               end) AS cnt
    FROM teamnames AS tn JOIN
         caseaudit AS ca
         ON tn.teamID = ca.referteamID2
    WHERE ca.referteamid1 <> ca.referteamid2 AND
          teamid IN (99, 107, 124, 27, 31, 44, 110, 43, 57, 50, 46)
    GROUP BY tn.teamtext
    ORDER BY tn.teamtext 
    

    【讨论】:

      【解决方案2】:

      您可以尝试使用外连接,虽然我不确定这是否是一种有效的方法:

      SELECT tn.teamtext, SUM(case when ca.referteamID2 is null then 0 else 1) AS cnt
      FROM teamnames AS tn
      LEFT OUTER JOIN caseaudit AS ca
      ON tn.teamID = ca.referteamID2
      WHERE CONVERT(smalldatetime,dModLast,101) BETWEEN '2012-03-01' AND '2012-03-10'
      AND ca.referteamid1 <> ca.referteamid2
      AND teamid IN (99, 107, 124, 27, 31, 44, 110, 43, 57, 50, 46)
      GROUP BY tn.teamtext
      ORDER BY tn.teamtext
      

      【讨论】:

      • 我在这里发布问题之前尝试过这个......使用内部或外部连接并没有对输出产生影响(在我的具体情况下)。但是,在某些特定情况下,这可能绝对是一个解决方案。
      • 啊,teamId 来自teamnames...尝试右外连接..这应该以正确的顺序工作
      最近更新 更多