2010-02-17 7 views
2

J'essaie d'exécuter une requête SQL qui génère une table avec deux colonnes faisant référence aux mêmes données mais utilisant des conditions différentes. Ma requête de résultats doit contenir des colonnes comme:Combiner des lignes de requête SQL Union

Interrogation Résultat:

  • Quantité totale
  • Disponible Quantité

Quantité totale est le nombre total d'un certain point et Disponible est un sous-ensemble du même élément, mais uniquement ceux qui sont marqués comme "Disponible".

J'ai essayé d'utiliser une UNION de la forme:

SELECT 
    '0' as Quantity, 
    COUNT (item.pkid) as Available 
FROM itemInstance, itemType 
WHERE 
    itemInstance.availability = 'AVAILABLE' 
    AND itemInstance.type = itemType.primary_key 
UNION 
SELECT 
    COUNT (DISTINCT item.pkid) as Quantity, 
    '0' as Available 
FROM itemInstance, itemType 
WHERE itemInstance.type = itemType.primary_key 

Ce qui bien sûr produit quelque chose comme:

Quantity Available 
1 0   2 
2 4   0 
3 0   3 
4 7   0 

Quand je veux vraiment:

Quantity Available 
1 4   2 
2 7   3 

Tous l'aide serait appréciée. Merci!

Répondre

5

Je ne pense pas que je comprends tous les aspects de votre requête, mais il devrait essentiellement travailler comme ceci:

SELECT 
    COUNT(*) as Quantity, 
    SUM(CASE WHEN itemInstance.availability = 'AVAILABLE' 
      THEN 1 
      ELSE 0 
      END) As Available 
FROM itemInstance, itemType 
WHERE itemInstance.type = itemType.primary_key 

Le CASE sera 1 pour chaque ligne de matchin et 0 pour les lignes non-matchin, donc la somme de ces valeurs est le nombre d'éléments disponibles.

BTW: Vous pouvez passer à la notation explicite pour rejoindre une meilleure readablity (en particulier avec des requêtes plus complexes):

... 
FROM itemInstance 
JOIN itemType ON (itemInstance.type = itemType.primary_key) 
+0

ne peut pas écrire mieux - bien fait. – incarnate

+0

Cela fonctionne magnifiquement! Merci! – RobotNerd

+0

Bon sur vous lui demandant d'utiliser des jointures explicites. Les jointures implicites sont une si mauvaise pratique. – HLGEM