2017-10-09 48 views
1

我有這樣的SQL查詢:總和列

SELECT distinct USERID, 
case when ACTVCODE = 'POC' then count(ACTVCODE) end POC, 
case when ACTVCODE = 'PIC' then count(ACTVCODE) end PIC, 
case when ACTVCODE = 'EML' then count(ACTVCODE) end EML, 
case when ACTVCODE = 'AD' then count(ACTVCODE) end AD, 
case when ACTVCODE = 'LOG' then count(ACTVCODE) end LOG, 
case when RESULTCODE = 'SR' then count(ACTVCODE) end SR, 
case when RESULTCODE = 'DM' then count(ACTVCODE) end DM, 
case when RESULTCODE = 'GK' then count(ACTVCODE) end GK, 
case when RESULTCODE = 'AM' then count(ACTVCODE) end AM, 
case when RESULTCODE = 'NA' then count(ACTVCODE) end NA, 
case when RESULTCODE = 'RO' then count(ACTVCODE) end RO, 
case when RESULTCODE = 'ORE' then count(ACTVCODE) end ORE, 
case when RESULTCODE = 'COM' then count(ACTVCODE) end COM, 
case when RESULTCODE = 'SMS' then count(ACTVCODE) end SMS, 
case when RESULTCODE = 'SV' then count(ACTVCODE) end SV, 
case when RESULTCODE = 'QUO' then count(ACTVCODE) end QUO, 
case when RESULTCODE = 'PQU' then count(ACTVCODE) end PQU 
FROM GoldMine.dbo.RESULT_COUNTS RESULT_COUNTS, GoldMine.dbo.USERGRP USERGRP, 
GoldMine.dbo.WT_GMUser WT_GMUser WHERE (RESULT_COUNTS.ONDATE>= '10/3/2017' 
And RESULT_COUNTS.ONDATE<= '10/3/2017') AND 
(RESULT_COUNTS.USERID=WT_GMUser.USERNAME) AND (WT_GMUser.Memberships Like 
'%Corp%') GROUP BY RESULT_COUNTS.USERID, RESULT_COUNTS.ACTVCODE, 
RESULT_COUNTS.RESULTCODE 

這裏是它產生的數據的一個樣本:

Sample

我試圖讓那裏的用戶名只顯示了一次,並且列中有值的總和。我認爲使用「獨特」會使用戶名只出現一次,但它沒有按照我預期的方式工作。我的問題是我可以添加到我的sql語句,以獲得每個USERID一行和每個列後的所有值的總和。

讓我知道你是否需要任何信息。謝謝

+0

您是在SQL還是VB.Net中執行此操作? – djv

回答

3

我認爲你正在尋找條件聚合。這將是這個樣子:

SELECT rc.USERID, 
     sum(case when rc.ACTVCODE = 'POC' then 1 else 0 end) as POC, 
     sum(case when rc.ACTVCODE = 'PIC' then 1 else 0 end) as PIC, 
     . . . 
FROM GoldMine.dbo.RESULT_COUNTS rc JOIN 
    GoldMine.dbo.WT_GMUser u 
    ON rc.USERID = u.USERNAME 
WHERE rc.ONDATE >= '2017-10-03' AND 
     rc.ONDATE <= '2017-10-03' AND 
     u.Memberships Like '%Corp%' 
GROUP BY rc.USERID; 

注:

  • 你似乎缺少用戶組一個JOIN條件和表不是否則在查詢中使用。所以我刪除了那張桌子。
  • 從不FROM條款中使用逗號。 始終使用使用正確的,明確的JOIN語法。
  • 如果你要定義表別名,使它們縮寫。該查詢更易於編寫和閱讀。
  • 限定條件全部當查詢引用多個表時,列名。
  • 使用ISO標準日期格式。
+0

這工作完美!感謝您的幫助和建議,以幫助我的代碼 – KMurray

+0

如果我想在'LOG'列之後有一個Totals列以通過LOG獲取POC的總和,該怎麼辦? – KMurray

+1

使用'sum(rc.actvcode in(...)then 1 else 0 end)'。 –

0

所以,你要每RESULT_COUNTS.USERID一行:

... 
GROUP BY RESULT_COUNTS.USERID; 

然後用行的地方ACTVCODE = 'POC'頭號列:

SELECT 
    COUNT(CASE WHEN ACTVCODE = 'POC' THEN 1 END) POC, 

case表達其他行映射到null(因隱含條款case)。 nullcount忽略,因此它只返回ACTVCODE = 'POC'的行數。

相同的技術可以用於其他列。

有關此技術的更多信息:http://modern-sql.com/use-case/pivot