2012-06-05 39 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在组中。我已经修复了这个问题 –