2015-02-11 56 views
1

在这个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(第1查询结果,第2个查询结果,第3查询结果,第4个查询结果)

+0

请后预期的输出格式。 – 2015-02-11 08:03:00

+0

@wewesthemenace请立即检查 – SpringLearner 2015-02-11 08:05:32

+0

那么,您期待单行输出? – 2015-02-11 08:07:42

回答

1

这里是s的两种常规方法olving它:

例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 CASE:

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 
2
select value, count(id) 
from status 
group by value 
+0

感谢您的回答,但我必须有条件使用我的情况。在小提琴我只提供了一个参数(ID),但在我的情况下有2或3参数(但在所有ID参数是commmon) – SpringLearner 2015-02-11 08:06:36

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]

我没赶上一部分,你想让它全部在一行。

就环绕你的语句SELECThttp://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作为结果。

+0

谢谢,我试过在sqlfiddle,但它不显示任何输出 – SpringLearner 2015-02-11 08:12:57

+1

联盟丢弃非独特的值,所以使用他的例子,你只能得到一列结果的一列。 – Smutje 2015-02-11 08:13:56

+0

然后使用Union All保留重复项。 – 2015-02-11 08:14:39

1

你应该更好地被下面的查询数由值的行和组:

SELECT COUNT(*) FROM status GROUP BY value 

或更好的说明,并期待试试这个:

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

这是好的,如果我需要比较只有一列(id),如何如果我必须与其他列进行比较 – SpringLearner 2015-02-11 08:15:21

+0

只需添加它们两个选择(如果有必要)和group by(must !!!)子句。有关使用GROUP BY子句的更多详细信息,请参阅https://msdn.microsoft.com/en-us/library/ms177673.aspx – user3021830 2015-02-11 08:16:31

+0

我希望使用此模式:创建表状态( id int主键IDENTITY(1 ,1),值int,类别int); (1,1),(2,1),(3,2),(4,2),(1,3),(2,2),(3,1),(4,1) ,(1,1),(2,1),(3,2),(4,2),(1,1),(2,2),(3,2),(4,2 ) – user3021830 2015-02-11 08:19:11

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