如何加入多个查询

How to get join multiple queries

在这个 http://sqlfiddle.com/#!6/aa0e17/4 中,您可以看到 id 是主键并且自动递增,values 列是 int 类型。要根据值检索计数,我正在执行 4 个不同的查询

select count(id) from status where value=1
select count(id )from status where value=2
select count(id) from status where value=3
select count(id) from status where value=4

我的要求是在单个查询中获得所有这些计数。

我为什么要?

上面的 table 只是一个演示 table,只有 4 个查询,但在我的场景中,我有 35 个查询,所以我必须在 java 中执行 35 个方法。

预期输出:4,4,4,4(第1个查询结果,第2个查询结果,第3个查询结果,第4个查询结果)

select value, count(id)
from status 
group by value

使用UNION(或UNION ALL来保留重复值)如:

select count(id) from status where value=1
UNION
select count(id )from status where value=2
UNION
select count(id) from status where value=3
UNION
select count(id) from status where value=4

在这里查看类似的问题:

[编辑 1]

检查 fiddle,它在我的机器上工作 ;) http://sqlfiddle.com/#!6/b89ef/1/0

因为我从插入中删除了一个 (3),所以你得到 4,3(我在这里只选择四和三)。

[编辑 2]

我没有在一行中看到你想要的部分。

只需将 SELECT 包裹在您的语句周围,例如 http://sqlfiddle.com/#!6/aa0e17/34/0:

select
  (select count(id) from status where value=1),
  (select count(id) from status where value=2),
  (select count(id) from status where value=3),
  (select count(id) from status where value=4)
;

结果是一行 4,4,4,4。

您最好通过以下查询按值计算行数和分组:

SELECT COUNT(*) FROM status GROUP BY value

或者为了更好的描述,试试这个:

SELECT value, COUNT(*) AS COUNT FROM status GROUP BY value

如果您要查找的是逗号分隔的字符串,那么这可能会有所帮助:

WITH CTE(N) AS(
    SELECT COUNT(ID) FROM STATUS WHERE VALUE=1 UNION ALL
    SELECT COUNT(ID )FROM STATUS WHERE VALUE=2 UNION ALL
    SELECT COUNT(ID) FROM STATUS WHERE VALUE=3 UNION ALL
    SELECT COUNT(ID) FROM STATUS WHERE VALUE=4 UNION ALL
)
SELECT STUFF((
    SELECT N', ' + CONVERT(VARCHAR(10), N) 
    FROM CTE FOR XML PATH(''), TYPE
    ).value('text()[1]','nvarchar(max)')
, 1 , 2 , N'')

这里有两种正常的解决方法:

示例 1 枢轴:

SELECT [1] count1,[2] count2,[3] count3,[4] count4
FROM  
( 
  SELECT id, value 
  FROM status
) p 
PIVOT (COUNT(id) FOR [value] IN ([1], [2], [3], [4])) AS pvt 

如果要将列合并为一个,请使用 CONCAT

为此,请将第一个示例中的第一行替换为:

SELECT CONCAT([1],',',[2],',',[3],',',[4])

示例 2 案例:

SELECT 
  COUNT(CASE WHEN value = 1 THEN 1 END) count1,
  COUNT(CASE WHEN value = 2 THEN 1 END) count2,
  COUNT(CASE WHEN value = 3 THEN 1 END) count3,
  COUNT(CASE WHEN value = 4 THEN 1 END) count4
FROM status