在此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(第一查询结果,第二查询结果,第三查询结果,第四查询结果)
答案 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'')