我需要对数据库中的各个表执行一些计数
,我想将这些计数合并到一个结果中.
Conider以下查询:
SELECT 100 As SomeCount
SELECT 200 As SomeOtherCount
SELECT 300 As YetAnotherCount
Run Code Online (Sandbox Code Playgroud)
如果我使用它们UNION,每个结果将是最终结果中的一行:
SELECT 100 As SomeCount
UNION
SELECT 200 As SomeOtherCount
UNION
SELECT 300 As YetAnotherCount
Run Code Online (Sandbox Code Playgroud)
输出:
> SomeCount
> --------- 
> 100 
> 200 
> 300
Run Code Online (Sandbox Code Playgroud)
我想要的是
> SomeCount | SomeOtherCount | YetAnotherCount
> --------------------------------------------
>   100     |      200       |     300
Run Code Online (Sandbox Code Playgroud)
我能想到的另一种方法是"命名"结果是使用类似这样的东西:
SELECT 'SomeCount' As Name, 100 As Value
UNION ALL
SELECT 'SomeOtherCount', 200
UNION ALL
SELECT 'YetAnotherCount', 300
Run Code Online (Sandbox Code Playgroud)
在这种情况下,结果如下:
>     Name          |      Value
> ---------------------------------
> 'SomeCount'       |       100
> 'SomeOtherCount'  |       200
> 'YetAnotherCount' |       300
Run Code Online (Sandbox Code Playgroud)
有没有办法得到我想要的结果,或者是最后一种方法?
我应该提一下上面的查询非常简单,以解释核心问题.实际上,需要组合的两个查询可能如下所示:
查询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')
 )
Run Code Online (Sandbox Code Playgroud)
查询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')
)
Run Code Online (Sandbox Code Playgroud)
将这些包装在另一个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')
)
Run Code Online (Sandbox Code Playgroud)
结果是这样的:
>     Name           |     Value
> ---------------------------------
> UndeliveredEMail   |       82
> UndeliveredSms     |       0
Run Code Online (Sandbox Code Playgroud)
当然,实际上还有很多事情需要考虑
您应该能够在查询之间使用 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')
  )
);
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           7533 次  |  
        
|   最近记录:  |