如何加入多个查询

时间:2015-02-11 08:01:25

标签: sql sql-server sql-server-2012

在此http://sqlfiddle.com/#!6/aa0e17/4中,您可以看到id是主键并且自动递增,而值列是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

我的要求是在一次查询中获取所有这些计数。

为什么我要?

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

预期输出:4,,4,4,4(第一查询结果,第二查询结果,第三查询结果,第四查询结果)

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

使用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

在这里查看类似的问题:https://stackoverflow.com/a/6066234

[编辑1]

检查小提琴,它适用于我的机器;)http://sqlfiddle.com/#!6/b89ef/1/0

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

[编辑2]

我没有在一条线上找到你想要的部分。

只需在http://sqlfiddle.com/#!6/aa0e17/34/0之类的语句中包含SELECT

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。

答案 2 :(得分:1)

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

SELECT COUNT(*) FROM status GROUP BY value

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

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

答案 3 :(得分:1)

以下是解决问题的两种常用方法:

示例1 PIVOT:

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

答案 4 :(得分:0)

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

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'')