2010-10-21 16 views
1

Je le tableau suivant: alt textProblème avec le fonctionnement SQL UNION

Je suis en train de créer une requête SQL qui retourne une table qui retourne trois champs: Année (ActionDate), comte de Pierre (actiontype = 12), Count of Lost (type d'action = quelques unes différentes) Basiquement, ActionType est un code de recherche. Donc, je reviendrais quelque chose comme:

 YEAR CountofBuilt CountofLost 
     1905  30   18 
     1929  12   99 
     1940  60   1 
etc.... 

Je pensais que cela prendrait deux instructions SELECT avec UNION. J'ai essayé ci-dessous mais il ne fait que recruter deux colonnes (année et compilation). Mon champ countLost ne semble pas

Mon sql actuellement (MS Access):

SELECT tblHist.ActionDate, Count(tblHist.ActionDate) as countBuilt 
FROM ... 
WHERE ((tblHist.ActionType)=12) 
GROUP BY tblHist.ActionDate 
UNION 
SELECT tblHist.ActionDate, Count(tblHist.ActionDate) as countLost 
FROM ... 
WHERE (((tblHist.ActionType)<>2) AND 
((tblHist.ActionType)<>3)) 
GROUP BY tblHist.ActionDate; 
+0

'UNION' va supprimer les doublons, donc ce que vous avez fournis peuvent être données manquantes ; 'UNION ALL' ne supprimera pas les doublons. –

Répondre

3

Utilisation:

SELECT h.actiondate, 
     SUM(IIF(h.actiontype = 12, 1, 0)) AS numBuilt, 
     SUM(IIF(h.actiontype NOT IN (2,3), 1, 0)) AS numLost 
    FROM tblHist h 
GROUP BY h.actiondate 
+0

Je reçois une erreur: "Erreur de syntaxe (opérateur manquant) dans l'expression de requête 'SUM (CASE WHIT tblHist.ActionType = 12 ALORS 1 ELSE 0 END)' – stuttsdc

+0

@stuttsdc: Actualiser la page - J'ai remarqué que vous utilisiez Access après avoir affiché le répondre, et mis à jour –

+0

Eh bien, je reçois toujours une erreur: Erreur de syntaxe (opérateur manquant) dans l'expression de requête 'SUM (IIF (tblHist.ActionType = 12 ALORS 1 ELSE 0 FIN))' – stuttsdc

1

Vous ne devriez pas utiliser UNION pour de telles requêtes. Il y a plusieurs façons de faire ce que vous voulez, par exemple mis à jour pour adapter la syntaxe d'accès

SELECT tblHist.ActionDate, 
COUNT(SWITCH(tblHist.ActionType = 12,1)) as countBuilt, 
COUNT(SWITCH(tblHist.ActionType <>1 OR tblHist.ActionType <>2 OR ...,1)) as countLost 
FROM .. 
WHERE .... 
GROUP BY tblHist.ActionDate 
+0

Pour les conditions de création de countLost, il m'est presque plus facile d'indiquer ce que les ActionType #s ne devraient pas utiliser. Par exemple, si je veux tous les ActionTypes qui ne sont pas 2, 3 ou 9, est-ce que je peux juste le brancher sur ci-dessus ou est-ce que je m'attends au contraire? Puis-je entrer une série de nombres? – stuttsdc

+1

Vous pouvez entrer n'importe quelle condition que vous voulez ('IN',' NOT IN', résultat de sous-requête, etc.). – a1ex07

+0

L'idée est que 'COUNT' renvoie un nombre de valeurs non nulles, et' CASE' a la valeur par défaut 'ELSE NULL'; – a1ex07