2013-08-02 104 views
2

我有,我用得到的一些字段的項目計數的查詢:TSQL分組字段

SELECT (SUBSTRING(p.filename,5,9))AS pub, 

    COUNT(hc.queue)AS Hold, 
    COUNT(pff.queue)AS ppf, 
    FROM Preflight_Queue p 

    LEFT OUTER JOIN (SELECT status,COUNT(*)AS queue FROM Preflight_Queue WHERE status = 4 GROUP BY status)hc on hc.status= p.status 
    LEFT OUTER JOIN (SELECT status,COUNT(*)AS queue FROM Preflight_Queue WHERE status = 2 GROUP BY status)pff on pff.status= p.status 
    group by SUBSTRING(P.filename,5,9) 

這給設定這樣的記錄:在一個單獨的表

pub   Hold  pff  
RET-S0313  14  14 
ABC-X0313  20  5 

但是( Preflight_Status)我需要獲得兩個額外的字段(forecolor和backcolor)。

兩個表已根據論文關係的兩個字段:

preflight_queue.status = preflight_staus.id

SO我試圖執行以下操作:

SELECT(SUBSTRING(p.filename, 5,9))AS酒館,

COUNT(hc.queue)AS Hold,(hc.forecolor)as holdfc,(hc.backcolor) AS holdbc, 
COUNT(pff.queue)AS pff,(pff.forecolor)as pfffc,(pff.backcolor) AS pffbc FROM Preflight_Queue p LEFT OUTER JOIN (
       SELECT p.status,s.forecolor,s.backcolor,COUNT(*)AS queue FROM Preflight_Queue p 
       JOIN preflight_Status s on s.id = p.status WHERE p.status = 4 
       GROUP BY p.status,s.forecolor,s.backcolor 
       )hc on hc.status= p.status 
LEFT OUTER JOIN (
       SELECT p.status,s.forecolor,s.backcolor,COUNT(*)AS queue FROM Preflight_Queue p 
       JOIN preflight_Status s on s.id = p.status WHERE p.status = 2 
       GROUP BY p.status,s.forecolor,s.backcolor 
       )pff on pff.status= p.status group by SUBSTRING(P.filename,5,9),hc.forecolor,hc.backcolor,pff.forecolor,pff.backcolor 

然而,因爲我現在必須將前景色和背景色組合在一起。我得到這個結果:

pub   Hold  pff holdfc holdbc  pfffc   pffbc 

RET-S0313  14  14  null  null  null   null 
RET-S0313  null null 0x000000 0xFF99FF null   null 
ABC-X0313  20  5  null  null  null   null 
ABC-X0313  null null null  null  0x000000  0xFFCCFF 

什麼,我希望做的是擁有一切在同一行這樣的:

pub   Hold pff holdfc  holdbc  pfffc  pffbc 

RET-S0313  14  14 0x000000 0xFF99FF 0x000000 0x000000  
ABC-X0313  20  5  0x000000 0xFF99FF 0x000000 0xFFCCFF 

不知道如何取得一排?

+0

在您的第一個查詢中,hc和pff的子查詢是相同的,它們都以相同的方式連接到p - 它們如何產生不同的結果? –

+0

我的不好這是一個type'o感謝指出, – Mike

回答

0

相信你的第一查詢可以像這樣進行簡化:

SELECT 
SUBSTRING(filename,5,9)AS pub, 
SUM(case when status = 2 then 1 else 0 end) as hold, 
SUM(case when status = 4 then 1 else 0 end) as ppf 
FROM preflight_queue 
GROUP BY SUBSTRING(filename,5,9) 

其中,假設顏色和p.status之間的1對1的關係,您的要求變得更容易:

SELECT 
    SUBSTRING(p.filename,5,9)AS pub, 
    SUM(case when p.status = 2 then 1 else 0 end) as hold, 
    SUM(case when p.status = 4 then 1 else 0 end) as ppf, 
    MAX(case when s.id = 2 then s.forecolor else null end) as holdfc, 
    MAX(case when s.id = 2 then s.backcolor else null end) as holdbc, 
    MAX(case when s.id = 4 then s.forecolor else null end) as holdfc, 
    MAX(case when s.id = 4 then s.backcolor else null end) as holdbc 
FROM preflight_queue p 
inner join preflight_status s on p.status = s.id 
GROUP BY 
    SUBSTRING(filename,5,9) 
+0

我決定採取你的意見,並打破了另一張桌子的顏色..我不是爲什麼我沒有想到這一點..謝謝。 – Mike

+0

先生,我想我很快就跳起來了,前景色和背景色都在一張單獨的桌子上。該關係與preflight_queue表中的字段狀態有關,所以preflight_queue = preflight_Status.status.id – Mike

+0

好的,我編輯了我的答案。經仔細檢查,我認爲你不能擺脫所有的病例陳述,除非你在我的文章結尾處採用另一種方法。 –