[英]Combine multiple results as columns, not rows
我需要對數據庫中的各個表進行大量計數
我想將這些計數合並為一個結果。
考慮以下查詢:
SELECT 100 As SomeCount
SELECT 200 As SomeOtherCount
SELECT 300 As YetAnotherCount
如果我使用UNION
合並它們,則每個結果將在最終結果中排成一行:
SELECT 100 As SomeCount
UNION
SELECT 200 As SomeOtherCount
UNION
SELECT 300 As YetAnotherCount
輸出:
> SomeCount
> ---------
> 100
> 200
> 300
我想要的是
> SomeCount | SomeOtherCount | YetAnotherCount
> --------------------------------------------
> 100 | 200 | 300
我可以想到的“命名”結果的唯一其他方法是使用類似以下內容的方法:
SELECT 'SomeCount' As Name, 100 As Value
UNION ALL
SELECT 'SomeOtherCount', 200
UNION ALL
SELECT 'YetAnotherCount', 300
在這種情況下,結果如下所示:
> Name | Value
> ---------------------------------
> 'SomeCount' | 100
> 'SomeOtherCount' | 200
> 'YetAnotherCount' | 300
有沒有一種方法可以得到我想要的結果,還是最后一種方法呢?
我應該提到上面的查詢非常簡單,以解釋核心問題。 實際上,需要組合的兩個查詢可能看起來像這樣:
查詢1:
SELECT Count(Id) As UndeliveredSms
FROM
(
SELECT Id
FROM IncomingSms
WHERE Id NOT IN (SELECT IncomingSmsId
FROM DeliveryAttempt
WHERE Status = 'Delivered' OR Status = 'FailedPermanently')
)
查詢2:
SELECT Count(Id) As UndeliveredEMail FROM
(
SELECT Id
FROM IncomingEMail
WHERE Id NOT IN (SELECT IncomingEMailId
FROM DeliveryAttempt
WHERE Status = 'Delivered' OR Status = 'FailedPermanently')
)
將它們包裝在另一個SELECT
語句中不適用於SQlite。
使用示例中的最后一種方法確實可行,除非有壞主意,否則我可以選擇該解決方案:
SELECT 'UndeliveredSms' As Name, Count(Id) As Value
FROM
(
SELECT Id
FROM IncomingSms
WHERE Id NOT IN (SELECT IncomingSmsId
FROM DeliveryAttempt
WHERE Status = 'Delivered' OR Status = 'FailedPermanently')
)
UNION
SELECT 'UndeliveredEMail', Count(Id) FROM
(
SELECT Id
FROM IncomingEMail
WHERE Id NOT IN (SELECT IncomingEMailId
FROM DeliveryAttempt
WHERE Status = 'Delivered' OR Status = 'FailedPermanently')
)
結果是這樣的:
> Name | Value
> ---------------------------------
> UndeliveredEMail | 82
> UndeliveredSms | 0
當然,實際上,還有很多事情要數
您應該能夠在查詢之間使用CROSS JOIN:
SELECT *
FROM
(
SELECT Count(Id) As UndeliveredSms
FROM
(
SELECT Id
FROM IncomingSms
WHERE Id NOT IN (SELECT IncomingSmsId
FROM DeliveryAttempt
WHERE Status = 'Delivered' OR Status = 'FailedPermanently')
)
)
CROSS JOIN
(
SELECT Count(Id) As UndeliveredEMail FROM
(
SELECT Id
FROM IncomingEMail
WHERE Id NOT IN (SELECT IncomingEMailId
FROM DeliveryAttempt
WHERE Status = 'Delivered' OR Status = 'FailedPermanently')
)
);
我不理解在您的查詢中使用UNION
,但也許我誤會了。 不在子集中並集不是全部=不在子集中...
似乎可以簡化為以下內容:
select *
from
(
SELECT Count(Id) As UndeliveredSms
FROM IncomingSms
WHERE Id NOT IN (SELECT IncomingSmsId
FROM DeliveryAttempt
WHERE Status = 'Delivered' OR Status = 'FailedPermanently')
) t,
(
SELECT Count(Id) As UndeliveredEMail
FROM IncomingEMail
WHERE Id NOT IN (SELECT IncomingEMailId
FROM DeliveryAttempt
WHERE Status = 'Delivered' OR Status = 'FailedPermanently')
) t2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.