我需要对数据库中的各个表执行多项计数 我希望将这些计数合并为一个结果。
协调以下查询:
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
当然,实际上,还有很多事情可以计算
答案 0 :(得分:4)
您应该能够在查询之间使用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')
)
);
答案 1 :(得分:1)
我不理解你的查询中使用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