2014-09-26 85 views
1

我正在做一個SQL語法聯盟,我想有這樣的結果:在SQL語法聯盟合併數據

+---------------+-----+---------+ 
|trkBusinessUnit| New | Pending | 
+---------------+-----+---------+ 
|  AIIB   2  0 | 
| Credit Control 1  3 | 
| Direct Center 1  2 | 
| Financial Ins  1  1 | 
| Motor Acclaim  1  0 | 
+-------------------------------+ 

從我的代碼:

SELECT trkBusinessUnit, Count(*) as New,0 as Pending 
FROM tblDTPTracker 
WHERE trkStatus = 'New' 
GROUP BY trkBusinessUnit 

UNION 

SELECT trkBusinessUnit,0 as New,Count(*) as Pending 
FROM tblDTPTracker 
WHERE trkStatus = 'Pending' 
GROUP BY trkBusinessUnit 

但隨後的電流輸出是:

+---------------+-----+---------+ 
|trkBusinessUnit| New | Pending | 
+---------------+-----+---------+ 
|  AIIB   2  0 | 
| Credit Control 1  0 | 
| Credit Control 0  3 | 
| Direct Center 1  0 | 
| Direct Center 0  2 | 
| Financial Ins  1  0 | 
| Financial Ins  0  1 | 
| Motor Acclaim  1  0 | 
+-------------------------------+ 

我錯過了什麼或做錯了什麼?好心提醒。

回答

1

有(或已經)在以前的答案的一些語法問題,但兩者較早答案的意圖是正確的,你需要使用一個GROUP BY查詢,而不使用UNION - 它根本不會做你希望或期望的。

UNION或UNION ALL按行工作行,絕對不要用柱合併

因此,基於查詢MySQL的語法組可以是任何這些:使用

COUNT()使用隱式NULL

SELECT 
     trkBusinessUnit 
    , COUNT(CASE WHEN trkStatus = 'New'  THEN 1 END) as New 
    , COUNT(CASE WHEN trkStatus = 'Pending' THEN 1 END) as Pending 
FROM tblDTPTracker 
GROUP BY trkBusinessUnit 
; 

COUNT()顯式NULL

SELECT 
     trkBusinessUnit 
    , COUNT(CASE WHEN trkStatus = 'New'  THEN 1 ELSE NULL END) as New 
    , COUNT(CASE WHEN trkStatus = 'Pending' THEN 1 ELSE NULL END) as Pending 
FROM tblDTPTracker 
GROUP BY trkBusinessUnit 
; 

SUM()來替代計數:

select 
     trkBusinessUnit 
    , sum(case when trkStatus = 'New'  then 1 else 0 end) as New 
    , sum(case when trkStatus = 'Pending' then 1 else 0 end) as Pending 
from tblDTPTracker 
where trkStatus in ('Pending', 'New') 
group by trkBusinessUnit 
; 

道歉兩者馬克Gravell &丹尼爾Gadawski誰之前此答案;這個答案是你的衍生物。

See this SQLFiddle demo of these queries

0

聯盟追加的行垂直地(指出UNION也只對不同的行; UNION ALL通吃行)。你想要的是兩個子查詢的full outer join,或者更復雜的select。我會選擇後者!

select tblDTPTracker, 
     sum(case trkStatus when 'New' then 1 else 0 end) as New, 
     sum(case trkStatus when 'Pending' then 1 else 0 end) as Pending 
from tblDTPTracker 
where trkStatus in ('Pending', 'New') 
group by tblDTPTracker 

完全外部聯接的做法是這樣的:

SELECT ISNULL(x.trkBusinessUnit, y.trkBusinessUnit) as trkBusinessUnit, 
     ISNULL(x.New, 0) as New, 
     ISNULL(y.Pending, 0) as Pending 
FROM (
    SELECT trkBusinessUnit, Count(1) as New 
    FROM tblDTPTracker 
    WHERE trkStatus = 'New' 
    GROUP BY trkBusinessUnit) x 
FULL OUTER JOIN (  
    SELECT trkBusinessUnit, Count(1) as Pending 
    FROM tblDTPTracker 
    WHERE trkStatus = 'Pending' 
    GROUP BY trkBusinessUnit) y on y.trkBusinessUnit = x.trkBusinessUnit 
+0

嗨馬克感謝您的回答;然而,我有一個錯誤,說'查詢表達式'中缺少運算符sum(case'trkStatus','New'then 1 else 0 end'')。我們怎樣才能對此做出修正?謝謝 – CaptainBadass 2014-09-26 08:59:56

+0

上面使用的case表達式不需要用於case語句的'case end'。 http://dev.mysql.com/doc/refman/5.7/en/case.html – 2014-09-26 09:17:41

+0

嗨,馬克,我做了你說的,但仍然是一樣的。儘管它會在第一個總和句法上高亮「trkStatus」。 – CaptainBadass 2014-09-26 09:18:11

1

如果我理解正確的話,你沒有使用一個工會。

嘗試:

SELECT 
    trkBusinessUnit, 
    COUNT(CASE WHEN trkStatus = 'New' THEN 1 ELSE NULL END) as New, 
    COUNT(CASE WHEN trkStatus = 'Pending' THEN 1 ELSE NULL END) as Pending 
FROM tblDTPTracker 
GROUP BY trkBusinessUnit 
+0

嗨丹尼爾謝謝你的回答;然而,我有一個錯誤,說'在查詢表達式中缺少運算符'計數(當trkStatus ='New'THEN 1 ELSE NULL END'時')。我們如何處理這個問題?謝謝 – CaptainBadass 2014-09-26 09:02:46

+0

我認爲你的查詢被錯誤地轉義了。你可以顯示你調用這個查詢的代碼嗎? – 2014-09-26 09:09:09

+0

「缺少的操作符」是由於[mysql的'case'語法](http://dev.mysql.com/doc/refman/5.0/en/case.html) - 它只需要以'end case'結尾而不僅僅是「結束」。 – 2014-09-26 09:10:50