2012-06-05 41 views
0

我需要將由子查詢生成的單個列表作爲父查詢生成的表的最後一列。將子查詢臨時表加入查詢表

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, 
    (SELECT sum(case when CONVERT(smalldatetime,dModLast,101) BETWEEN '2012-03-01' AND '2012-03-10' then 1 else 0 end) 
     FROM teamnames AS tn 
     JOIN caseaudit AS ca 
     ON tn.teamID = ca.referteamID2 
     WHERE ca.referteamid1 <> ca.referteamid2 
     AND isactive = 1 
     AND groupid = 18 
     AND accountid = 2) AS cnt2 
    FROM teamnames AS tn 
    JOIN caseaudit AS ca 
    ON tn.teamID = ca.referteamID2 
    WHERE ca.referteamid1 <= 0 
    AND ca.referteamid1 <> ca.referteamid2 
    AND isactive = 1 
    AND groupid = 18 
    AND accountid = 2 
    GROUP BY tn.teamtext 
    ORDER BY tn.teamtext 

給我:

4H BOSS     55 430 
4H BSG      0 430 
4H SALES AND MKTG   0 430 
ACCOUNTS RECEIVABLE  0 430 
ASSET MANAGEMENT   9 430 
AUDIT      0 430 
BOSS      4 430 
CORPORATE BSG    0 430 
CUSTOMER SUPPORT   87 430 
NETWORK ENGINEERING  11 430 
PRODUCTION ENGINEERING 116 430 
PRODUCTION OPERATIONS  0 430 
SECURITY     2 430 
SNFAL PRODUCT TEAM   0 430 
VOICE SERVICES   18 430 
XEROX      4 430 

的 '430' 是100%不正確。

+2

[第一編程規則:它總是你的錯](http://www.codinghorror.com/blog/2008/03/the-first-rule-of-programming-its-always-your-fault.html) – Andomar

+0

它應該是什麼?源數據是什麼?這還不算真正的問題 – Randy

+1

子查詢是否應該忽略'ca.referteamid1 <= 0'條件? – Neil

回答

1

這工作:

SELECT a.teamtext, a.cnt, b.cnt2 
FROM 

(SELECT tn.teamtext, tn.teamid, 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 
    LEFT OUTER JOIN caseaudit AS ca 
    ON tn.teamID = ca.referteamID2 
WHERE ca.referteamid1 <= 0 AND ca.referteamid1 <> ca.referteamid2 AND isactive = 1 AND groupid = 18 AND accountid = 2 
GROUP BY tn.teamtext, tn.teamid) AS a 

LEFT OUTER JOIN 

(SELECT tn.teamtext, tn.teamid, sum(case when CONVERT(smalldatetime,dModLast,101) BETWEEN '2012-03-01' AND '2012-03-10' then 1 else 0 end) AS cnt2 
    FROM teamnames AS tn 
    LEFT OUTER JOIN caseaudit AS ca 
    ON tn.teamID = ca.referteamID2 
    WHERE ca.referteamid1 <> ca.referteamid2 AND isactive = 1 AND groupid = 18 AND accountid = 2 
    GROUP BY tn.teamtext, tn.teamid) AS b 
ON a.teamid = b.teamid 
ORDER BY a.teamtext 
+0

這樣可以工作,但是你不需要它成爲'left join',因爲任何在'a'中的東西總是在'b'中,因爲where子句 –

2

它看起來像你希望沿着一個分組計數的總數。只需在FROM CLAUSE和CROSS JOIN中使用內聯查詢即可。

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, 
     t.TotalCnt 
FROM teamnames AS tn 
     JOIN caseaudit AS ca 
     ON tn.teamID = ca.referteamID2 
     CROSS JOIN (SELECT Sum(CASE 
           WHEN CONVERT(smalldatetime, dModLast, 101) 
            BETWEEN 
            '2012-03-01' AND '2012-03-10' THEN 1 
           ELSE 0 
           END) AS TotalCnt 
        FROM teamnames AS tn 
          JOIN caseaudit AS ca 
          ON tn.teamID = ca.referteamID2 
        WHERE ca.referteamid1 <> ca.referteamid2 
          AND isactive = 1 
          AND groupid = 18 
          AND accountid = 2) t 
WHERE ca.referteamid1 <= 0 
     AND ca.referteamid1 <> ca.referteamid2 
     AND isactive = 1 
     AND groupid = 18 
     AND accountid = 2 
GROUP BY tn.teamtext , t.TotalCnt 
ORDER BY tn.teamtext 

Simplified Demo

當然,如果你想要的是每隊文字和總數TeamText可以

  • 通過
  • 刪除組添加不同
  • 使用SUM(例)..)OVER(由teamtext劃分)爲每個teamtext
  • 使用SUM(Case ..)OVER(Par由空銀行足球比賽)的總計
  • 移動ca.referteamid1 <= 0進入第一SUM .. OVER


SELECT DISTINCT tn.teamtext, 
     Sum(CASE 
      WHEN CONVERT(smalldatetime, dModLast, 101) BETWEEN '2012-03-01' AND '2012-03-10' AND ca.referteamid1 <= 0 THEN 1 
      ELSE 0 
      END) OVER (PARTITION BY tn.teamtext) AS cnt, 
     Sum(CASE 
      WHEN CONVERT(smalldatetime, dModLast, 101) BETWEEN '2012-03-01' AND '2012-03-10' THEN 1 
      ELSE 0 
      END) OVER (PARTITION BY NULL) AS Totalcnt 

FROM teamnames AS tn 
     JOIN caseaudit AS ca 
     ON tn.teamID = ca.referteamID2 
WHERE 
     ca.referteamid1 <> ca.referteamid2 
     AND isactive = 1 
     AND groupid = 18 
     AND accountid = 2 
ORDER BY tn.teamtext 

Simplified demo

+0

我試着運行你的第一個建議並且得到一個錯誤: Msg 8120,Level 16,State 1,Line 1 列't.TotalCnt'在選擇列表中是無效的,因爲它不包含在任何一個聚合函數或GROUP BY子句。 我想出了一個更可讀的解決方案(在我看來)通過使用臨時表。見下面的答案。 –

+0

對不起,我忘了包括t.TotalCnt在組中。我已經修復了這個問題 –