8
votes

Compte SQL (*) et groupe par - Trouvez la différence entre les lignes

ci-dessous est une requête SQL que j'ai écrite pour trouver le nombre total de lignes par chaque ID de produit (proc_id): xxx

ci-dessous est le résultat de la requête SQL ci-dessus: xxx

remarque le nombre total de comptes par proc_id = '01', proc_id = '03', et proc_id = '05' sont différents (non égaux à 624 lignes comme l'autre proc_id).

Comment écrire une requête SQL pour rechercher quelles lignes proc_id sont différentes pour proc_id = '01', proc_id = '03' et proc_id = '05' par rapport à l'autre proc_id? < / p>

sql

1 commentaires

Si je comprends votre question correctement, nous avons besoin de plus d'informations sur la structure du reste de la table pour produire tout ce qui est logique.


6 Réponses :


2
votes

Si vous savez 624 est le numéro magique:

SELECT proc_id, count(*)
FROM proc
WHERE grouping_primary = 'SLB'
AND   eff_date = '01-JUL-09'
GROUP BY proc_id
HAVING count(*) <> 624
ORDER BY proc_id;


0 commentaires

14
votes

Tout d'abord, vous devez définir les critères qui font "624" correct. Est-ce la moyenne comptez (*) code>? Est-ce le nombre (*) code> qui survient le plus souvent? Est-ce votre Count préféré (*) CODE>?

Vous pouvez ensuite utiliser la clause pour séparer celles qui ne correspondent pas à vos critères: p>

SELECT proc_id, count(*)
FROM proc
WHERE grouping_primary = 'SLB'
AND   eff_date = '01-JUL-09'
GROUP BY proc_id
HAVING count(*) <> (
  <insert here a subquery that produces the magic '624'>
 )
ORDER BY proc_id;


0 commentaires

0
votes

Essayez ceci:

SELECT proc_id, count(*)
FROM proc
WHERE grouping_primary = 'SLB'
AND   eff_date = '01-JUL-09'
GROUP BY proc_id
HAVING count(*) <> (select count(*) from proc z where proc_id in (1) group by proc_id)
ORDER BY proc_id;


0 commentaires

0
votes

Vous ne pouvez pas faire cela. Pour certains accidents, il y a moins de lignes avec ce procédé. En d'autres termes, les rangées qui permettent à ce que procréant ne pas compter = 624 sont des rangées qui n'existent pas. Comment une requête peut-elle montrer ces lignes?

pour les accidents qui ont trop de lignes, si (et ceci est grand si), si toutes les lignes de la 624 pour d'autres accidents ont un attribut en commun avec un sous-ensemble comptent 624 des ensembles trop grande , alors vous pourrez peut-être identifier les lignes «supplémentaires», Buit Il n'ya aucun moyen d'identifier les lignes manquantes, tout ce que vous pouvez faire est d'identifier les accidents ayant trop de lignes ou trop peu ...


0 commentaires

0
votes

Si je comprends votre question correctement (qui est différente que les autres réponses postées), vous voulez les les lignes em> qui font proc_id 01 différent? Si tel est le cas, vous devez vous joindre à toutes les colonnes qui devraient être identiques et rechercher les différences. Donc, pour comparer 01 avec 02:

 SELECT [01].*
 FROM (
    SELECT * FROM proc
    WHERE grouping_primary = 'SLB'
    AND eff_date = '01-JUL-09'
    AND proc_id = '01'
 ) as [01]
 FULL JOIN (
    SELECT * FROM proc
    WHERE grouping_primary = 'SLB'
    AND eff_date = '01-JUL-09'
    AND proc_id = '02'
 ) as [02] ON
    [01].col1 = [02].col1
    AND [01].col2 = [02].col2
    AND [01].col3 = [02].col3
    /* etc...just don't include proc_id */
 WHERE
    [01].proc_id IS NULL --no match in [02]
    OR [02].proc_id IS NULL --no match in [01]


1 commentaires

Sauf que, si je comprends la question, ce n'est pas les valeurs de colonne qui le rendent différent, mais simplement le nombre de lignes avec ce procédé ... peu importe les valeurs de la colonne -



0
votes

Eh bien, afin de trouver l'extra, vous utiliseriez la phrase non conforme. Pour trouver les lignes manquantes, vous auriez besoin d'inverser la logique. Cela suppose naturellement que toutes les 624 lignes sont les mêmes de proc_id à proc_id.

SELECT proc_id, varying_column 
FROM proc
WHERE grouping_primary = 'SLB'
AND   eff_date = '01-JUL-09'
AND   varying_column NOT IN (SELECT b.varying_column 
                             FROM proc b
                             WHERE b.grouping_primary = 'SLB'
                             AND   b.eff_date = '01-JUL-09'
                             AND   b.proc_id = (SELECT FIRST a.proc_id
                                                FROM proc a
                                                WHERE a.grouping_primary = 'SLB'
                                                AND   a.eff_date = '01-JUL-09'
                                                AND   COUNT(a.*) = 624
                                                GROUP BY a.proc_id
                                                ORDER BY a.proc_id;))
ORDER BY proc_id, varying_column;


0 commentaires