2010-09-09 6 views
5

Si les données sont dans le format suivant:requête SQL pour trouver la somme de toutes les lignes et compte des doublons

SID TID Tdatetime  QID QTotal 
---------------------------------------- 
100 1 01/12/97 9:00AM 66 110 
100 1 01/12/97 9:00AM 66 110 
100 1 01/12/97 10:00AM 67 110 
100 2 01/19/97 9:00AM 66 . 
100 2 01/19/97 9:00AM 66 110 
100 2 01/19/97 10:00AM 66 110 
100 3 01/26/97 9:00AM 68 120 
100 3 01/26/97 9:00AM 68 120 
110 1 02/03/97 10:00AM 68 110 
110 3 02/12/97 9:00AM 64 115 
110 3 02/12/97 9:00AM 64 115 
120 1 04/05/97 9:00AM 66 105 
120 1 04/05/97 10:00AM 66 105 

Je voudrais être en mesure d'écrire une requête pour résumer la colonne Qtotal pour toutes les lignes et trouver le nombre de lignes en double pour la colonne Tdatetime.

La sortie ressemblerait à ceci:

Year Total Count
97 | 1340 | 4
La troisième colonne du résultat ne comprend pas le nombre de lignes distinctes dans la table. Et la sortie est regroupée par année dans la colonne TDateTime.

+1

Pour quelle base de données? –

+0

Je ne suis pas sûr de savoir quelles informations de base de données vous auriez besoin. – ARK

+0

Il demande ce qu'est le SGBD. SQL Server, Oracle, MySql, etc. –

Répondre

0

La requête suivante peut aider:

SELECT 
    'YEAR ' + CAST(sub.theYear AS VARCHAR(4)), 
    COUNT(sub.C), 
    (SELECT SUM(QTotal) FROM MyTable WHERE YEAR(Tdatetime) = sub.theYear) AS total 
FROM 
    (SELECT 
     YEAR(Tdatetime) AS theYear, 
     COUNT(Tdatetime) AS C 
    FROM MyTable 
    GROUP BY Tdatetime, YEAR(Tdatetime) 
    HAVING COUNT(Tdatetime) >= 2) AS sub 
+0

Cette requête ne semble pas fonctionner pour la situation présentée ci-dessus. – ARK

+0

J'ai mis à jour le code. – Zafer

+0

Je sais que c'est une vieille question, mais pour quelqu'un d'autre qui le trouve: 'HAVING COUNT (Tdatetime)> 2' devrait probablement être'> 1' ou '> = 2' sinon il ne trouvera rien là où il y a un compte de 2 – laurencemadill

0

Vous devez faire SELECT à partir de cette table GROUPing par QTotal, en utilisant COUNT (subSELECT de cette table où QTotal est identique). Si seulement j'avais le temps je vous écrirais une instruction SQL, mais cela prendra quelques minutes.

0

Quelque chose comme:

select Year(Tdatetime) ,sum(QTotal), count(1) from table group by year(Tdatetime) 

ou complet Date

select Tdatetime ,sum(QTotal), count(1) from table group by year(Tdatetime) 

Ou votre syntaxe laid (:))

select 'Year ' + cast(Year(tdatetime) as varchar(4)) 
    + '|' + cast(sum(QTotal) as varchar(31)) 
    + '|' + cast(count(1) as varchar(31)) 
from table group by year(Tdatetime) 

Ou voulez-vous que l'année? Somme toutes les colonnes? Ou juste par année?

+0

Somme de la colonne Qtotal regroupée par année dans la colonne TDateTime. Nombre de colonnes TDateTime en double. – ARK

1

Cela fonctionnera si vous voulez vraiment groupe par la colonne tDateTime:

SELECT DISTINCT tDateTime, SUM(QTotal), Count(distinct tDateTime) 
FROM Table 
GROUP BY tDateTime 
HAVING Count(distinct tDateTime) > 1 

Mais vos résultats ressembles vous voulez groupe par l'année dans la colonne tDateTime. Est-ce correct?

Si oui, essayez ceci:

SELECT DISTINCT YEAR (tDateTime), SUM(QTotal), Count(distinct tDateTime) 
FROM Table 
GROUP BY YEAR (tDateTime) 
HAVING Count(distinct tDateTime) > 1 
+0

Oui, je veux le regrouper par année dans la colonne TDateTime. – ARK

+0

Jetez un oeil à ma mise à jour –

+0

ne comprendra pas les lignes qui n'ont pas de lignes en double? le résultat de la requête ne doit afficher que le nombre de doublons, à l'exclusion des lignes distinctes. – ARK

0
SELECT 
YEar + year(Tdatetime), 
SUM (QTotal), 
(SELECT COUNT(*) FROM ( 
SELECT Tdatetime FROM tDateTime GROUP BY Tdatetime   
HAVING COUNT(QID) > 1) C 
FROM 
Tdatetime t 

GROUP BY 
YEar + year(Tdatetime) 
+0

Je pense que vous avez répondu à la question, mais je pense que la vraie question est fausse. Comme cela est montré, les données renvoyées sont dénormalisées. Il affiche le même nombre pour chaque ligne, avec une valeur qui est indicative de la population entière plutôt que de l'année du groupe. Je pense que la sous-requête interne doit être changée en sous-requête corrélée, en filtrant sur "year (Tdatetime)". –

0

C'est la première fois que je l'ai posé une question sur stackoverflow. Il semble que j'ai perdu mes informations d'identification d'origine. J'ai dû m'inscrire pour me connecter et ajouter des commentaires à la question que j'ai postée.

Pour répondre à la question OMG Ponies, il s'agit d'une base de données SQL Server 2008. @Abe Miessler, la ligne avec SID 120 ne contient pas de doublons. la première ligne pour SID 120 affiche 9:00 AM dans la colonne datetime et la deuxième ligne affiche 10:00 AM.

@Zafer, votre requête est la réponse acceptée. J'ai fait quelques petites modifications pour le faire fonctionner. Merci. Merci à Abe Miessler et aux autres pour votre aide.

+0

Vous devez marquer la réponse acceptée comme acceptée. – RickF

Questions connexes