2016-12-03 114 views
2

我有一對多的表。表ticket和表solution。每張票有幾種解決方案。解決方案有列:ticketIdstatusserviceId簡單的SQL與GROUP BY HAVING AND WHERE

所以,每張票都可以通過一個或多個服務解決。 Status可以是:ready to resolvedone。只有一項服務可以爲票證工作。但也有可用的情況,其中票證的所有解決方案都有狀態=可以解決。

我想從所有門票表對獲得:票行 - 解列,其中:服務Id = N和門票與狀態沒有其他服務=完成。

我試圖通過這個解決我的問題:

SELECT t.*, s.* FROM Ticket t 
JOIN Solution s ON t.id = s.ticketId 
WHERE s.serviceId = N 
GROUP BY s.ticketId HAVING SUM(CASE WHEN s.serviceId <> N AND s.status = 'done' THEN 1 ELSE 0 END) = 0; 

但這種方式不工作,因爲WHERE s.serviceId = N只選擇一行和ofcouse,總和永遠爲0。如果我刪除WHERE,再總結開始計算正確,但我從表solution總是第一排票,但我想要服務= N行。

我該如何解決它?

例子。

票務T.解決方案:S1(服務= N,狀態=就緒),S2(服務= K,狀態=就緒) - >得到(T,S1)。

票務T.解決方案:S1(服務= N,狀態=完成),S2(服務= K,狀態=就緒) - >得到(T,S1)。

票務T.解決方案:S1(服務= N,狀態=就緒),S2(服務= K,狀態=完成) - >空。

Ofcouse,可以S3,S4與服務Q,W ...但是不管怎麼說:零或一個解決方案將有狀態=完成。

+0

我在下面嘗試了一個答案,但是我覺得你的數據可能沒有被標準化。 –

+0

請提供反饋給下面給出的深思熟慮的答覆。 –

回答

0

取出Where條款和嘗試這個Having條款

HAVING SUM(CASE WHEN s.serviceId = 'N' AND s.status = 'done' THEN 1 ELSE 0 END) = 0 
    AND SUM(s.serviceId = 'N') > 0; 

考慮N應該是字符串

+0

他的查詢除此之外還有其他問題。 –

+0

@Prdp,票證的所有解決方案都可以有status ='ready to resolve'。現在更新第一篇文章。 –

+1

@YShinkarev - 您可以添加示例數據和預期結果。 –

0

使用子查詢首先確定門票不屬於done任何服務。然後將此結果加入Ticket表,並再次加入Solution,其中包括檢查服務ID爲N的解決方案的條件。

SELECT t.*, s2.* 
FROM Ticket t 
INNER JOIN 
(
    SELECT ticketId 
    FROM Solution 
    GROUP BY ticketId 
    HAVING SUM(CASE WHEN s.status = 'done' THEN 1 ELSE 0 END) = 0 
) s1 
    ON t.id = s1.ticketId 
INNER JOIN Solution s2 
    ON s1.ticketId = s2.ticketId AND 
     s2.serviceId = 'N'