2011-10-03 7 views
3

(également affiché here.)plusieurs requêtes dans différentes tables à

J'ai donc deux tables, l'une est la table invalid et l'autre est la table valid.

valid Table:

id 
status 
date 

invalid table:

id 
status 
date 

Je dois produire un rapport avec cette sortie:

date  on-time late total valid invalid1 invalid2 total rate 
--------- ------- ---- ----- ----- -------- -------- ----- ---- 
9/10/2011 4  10 14  3  3   3   6 
  • date: champs communs sur le 2 t ables, champ groupe par, le nombre d'enregistrements ce jour-là a
  • on-time: nombre de tous les id sur la table valide
  • late: nombre de tous les enregistrements (id) sur la table invalide
  • total: au total à temps et à la fin
  • valid: nombre d'id sur la table valide avec le statut « valide »
  • invalid1: nombre d'id sur la table invalide avec le statut
  • invalid2 « de invalid1 »: nombre de id sur la table invalide avec "invalid2" statut
  • total: au total valide, invalid1, invalid2
  • rate: moyenne des totaux

Il est essentiellement plusieurs requêtes avec table différente. Comment puis-je y arriver?

+0

Essayez de formater correctement votre article, s'il vous plaît. J'ai essayé mais je ne sais pas si «total» et «taux total» sont 2 colonnes différentes. – Icarus

+0

ils sont deux colonnes différentes –

+0

J'ai reformaté votre message, en particulier la table de sortie, car il semblait un peu confus. Certains bits semblent toujours manquants ou flous. Veuillez le réviser et le modifier le cas échéant. (Pour l'avenir, s'il vous plaît ne * pas * utiliser les onglets ici, ils donnent souvent un look foiré.) –

Répondre

2

someting comme ça?

SELECT 
    *, 
    (result.total + result._total)/2 AS rate 
FROM (
    SELECT 
     date, 
     SUM(CASE WHEN data.valid = 1 THEN 1 ELSE 0 END) AS ontime, 
     SUM(CASE WHEN data.valid = 0 THEN 1 ELSE 0 END) AS late, 
     COUNT(*) AS total, 
     SUM(CASE WHEN data.valid = 1 AND data.status = 'valid' THEN 1 ELSE 0 END) AS valid, 
     SUM(CASE WHEN data.valid = 0 AND data.status = 'invalid1' THEN 1 ELSE 0 END) AS invalid1, 
     SUM(CASE WHEN data.valid = 0 AND data.status = 'invalid2' THEN 1 ELSE 0 END) AS invalid2, 
     SUM(CASE WHEN data.status IN ('valid', 'invalid', 'invalid2') THEN 1 ELSE 0 END) AS _total 

    FROM (
     SELECT 
      date, 
      status, 
      valid = 1 
     FROM 
      Valid 
     UNION ALL 
     SELECT 
      date, 
      status, 
      valid = 0 
     FROM 
      InValid) AS data 
    GROUP BY 
     date) AS result 
+0

merci ou! C'est juste ce dont j'ai besoin! –

1
SELECT date, ontime, late, ontime+late total, valid, invalid1, invalid2, valid+invalid1+invalid2 total 
FROM 
(SELECT date, 
     COUNT(*) late, 
     COUNT(IIF(status = 'invalid1', 1, NULL)) invalid1, 
     COUNT(IIF(status = 'invalid2', 1, NULL)) invalid2, 
FROM invalid 
GROUP BY date 
) JOIN (
SELECT date, 
     COUNT(*) ontime, 
     COUNT(IIF(status = 'valud', 1, NULL)) valid, 
FROM valid 
GROUP BY date 
) USING (date) 
0

Tout d'abord, il semble que vous tenez exactement les mêmes informations dans 2 tables - Je recommande de fusionner ces tables ensemble et ajouter une colonne booléenne supplémentaire appelée valid pour tenir les informations relatives à la validité de l'enregistrement .

La requête sur la structure existante DB pourrait ressembler à ceci:

SELECT unioned.* FROM (
    (SELECT v.date AS date, v.status AS status, v.id AS id, COUNT(id) AS valid, 0 AS invalid1, 0 AS invalid2 FROM valid v GROUP BY v.date) 
    UNION 
    (SELECT i1.date AS date, i1.status AS status, i1.id AS id, 0 AS valid, COUNT(i1.id) AS invalid1, 0 AS invalid2 FROM invalid1 i1 GROUP BY i1.date) 
    UNION 
    (SELECT i2.date AS date, i2.status AS status, i2.id AS id, 0 AS valid, 0 AS invalid1, COUNT(i.id) AS invalid2 FROM invalid1 i1 GROUP BY i1.date) 

) AS unioned GROUP BY unioned.date 
+0

il me donne l'erreur ff: Colonne 'unioned.valid' est invalide dans la liste de sélection, car il n'est pas contenu dans une fonction d'agrégat ou dans la clause GROUP BY. La colonne 'unioned.invalid1' n'est pas valide dans la liste de sélection, car elle n'est contenue ni dans une fonction d'agrégat ni dans la clause GROUP BY. Colonne 'unioned.invalid2 'n'est pas valide dans la liste de sélection, car il n'est contenu ni dans une fonction d'agrégat ni dans la clause GROUP BY. –

Questions connexes