2010-09-22 7 views
2
Select id,count(*) as totalX FROM my_table WHERE x_factor = 1 GROUP BY id 

ResultSet:La combinaison (ensembles de résultats) de "deux requêtes avec agrégat et groupe par" est-elle possible?

id  totalX 
--------- -------------- 
     9    34 
     10    6 
     11    21 
     12    3 
Select id,count(*) as totalY FROM my_table WHERE y_factor = 1 GROUP BY id 

ResultSet 2:

id  totalY 
--------- -------------- 
     9    334 
     10    56 
     11    251 
     12    93 

Est-il possible que je peux y parvenir:

id  totalX  totalY   
--------- -------------- -------------- 
     9    34    334 
     10    6    56 
     11    21    251 
     12    3    93 

je voudrais la solution pour Sybase 12.5 sur RHEL 5, je voudrais aussi savoir si cela est possible dans tout autre système de base de données.

--- Merci pour la réponse (s) -

Comparing EXECUTION TIME: (For a certain query) 
Query 1: 
Execution Time 61. 
SQL Server cpu time: 6100 ms. SQL Server elapsed time: 12133 ms. 

Query 2: 
Execution Time 53. 
SQL Server cpu time: 5300 ms. SQL Server elapsed time: 12090 ms. 

Query X(1+2): 
Execution Time 84. 
SQL Server cpu time: 8400 ms. SQL Server elapsed time: 21456 ms. 

Répondre

4

En utilisant un CAS/QUAND pour la colonne et l'addition d'un 1 ou 0 sur la base vrai/faux, vous pouvez obtenir à la fois dans le même requête ... de plus, vous pouvez faire la même chose si vous voulez la somme d'une certaine valeur dans une autre colonne ... remplacer juste que pour la valeur réelle au lieu de 1.

select 
     id, 
     sum(CASE WHEN x_factor = 1 THEN 1 ELSE 0 END) as X_Count, 
     sum(CASE WHEN y_factor = 1 THEN 1 ELSE 0 END) as Y_Count 
    from 
     yourTable 
    group by 
     id 
+0

Ah .. Genius Pourquoi ne pas que je pense à ça :) Merci. J'ai édité ma question avec le temps d'exécution, si quelqu'un se soucie – Stewie

1

Cela devrait fonctionner:

SELECT id, 
     sum(case when x_factor = 1 then 1 else 0 end) as totalX, 
     sum(case when y_factor = 1 then 1 else 0 end) as totalY 
    FROM my_table 
    WHERE x_factor = 1 
     OR y_factor = 1 
    GROUP BY id 
+0

Merci .. cela fonctionne – Stewie

1

Le CASE ... {0 | 1} est une bonne astuce pour les gens, mais je pense que le problème est peut-être plus simple que cela. Avez-vous essayé:

SELECT id, COUNT(x_factor) AS count_x, COUNT(y_factor) AS count_y FROM my_table GROUP BY id

Questions connexes