Comment joindre plusieurs requêtes

Dans ce http://sqlfiddle.com/#!6/aa0e17/4 comme vous pouvez le voir, id est la key primaire et auto incrémentée et la colonne de valeurs est int type. Pour récupérer le nombre basé sur la valeur, je fais 4 requêtes différentes

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 

Mon exigence est d'get tous ces counts dans une seule requête.

Pourquoi je veux?

La table ci-dessus est juste une table démo et a seulement 4 requêtes mais dans mon scénario j'ai 35 requêtes et donc je dois faire 35 methods en java.

Sortie attendue: 4, 4,4,4 (1er résultat de la requête, 2ème résultat de la requête, 3ème résultat de la requête, 4ème résultat de la requête)

Voici les 2 moyens normaux de le résoudre:

Exemple 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 

Utilisez CONCAT si vous souhaitez combiner les colonnes en une seule.

Pour ce faire, remplacez la première ligne du premier exemple par:

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

Exemple 2 CAS:

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

Vous devriez mieux countr les lignes et grouper par la valeur par la requête suivante:

 SELECT COUNT(*) FROM status GROUP BY value 

ou pour une meilleure description et regardez essayer ceci:

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

Utilisez UNION (ou UNION ALL pour conserver les valeurs en double) comme:

 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 

Jetez un oeil à une question similaire ici: https://stackoverflow.com/a/6066234

[Modifier 1]

Vérifiez le violon, cela fonctionne sur ma machine;) http://sqlfiddle.com/#!6/b89ef/1/0

Depuis que j'ai enlevé un (3) de l'insert, vous obtenez 4,3 (je ne sélectionne que quatre et trois ici).

[Modifier 2]

Je n'ai pas attrapé la partie où vous vouliez tout sur une ligne.

Juste envelopper un SELECT autour de vos déclarations comme 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) ; 

Et votre résultat est une ligne avec 4,4,4,4 comme résultat.

Si ce que vous cherchez est une string délimitée par des virgules, cela peut être utile:

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