如何加入多个查询
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
在这个 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