2010-09-09 11 views
5

Se i dati è nel seguente formato:query SQL per trovare somma di tutte le righe e contare di duplicati

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 

Vorrei essere in grado di scrivere una query per riassumere la colonna QTotal per tutte le righe e trovare il conteggio delle righe duplicate per la colonna Tdatetime.

L'output sarà simile:

Year Total Count
97 | 1340 | 4
La terza colonna del risultato non include il conteggio delle righe distinte nella tabella. E l'output è raggruppato per l'anno nella colonna TDateTime.

+1

Per quale database? –

+0

Non sono sicuro di quali informazioni del database richiedere. – ARK

+0

Chiede cosa sia il DBMS. SQL Server, Oracle, MySql, ecc. –

risposta

0

La seguente query può aiutare:

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

Questa query non sembra funzionare per la situazione presentata sopra. – ARK

+0

Ho aggiornato il codice. – Zafer

+0

So che questa è una vecchia domanda, ma per chiunque altro la trovi: 'HAVING COUNT (Tdatetime)> 2' dovrebbe probabilmente essere>> 1' o'> = 2' altrimenti non troverà nulla dove c'è un conteggio di 2 – laurencemadill

0

È necessario eseguire SELECT da questa tabella GROUPing by QTotal, utilizzando COUNT (subSELECT da questa tabella WHERE QTotal è lo stesso). Se solo avessi tempo vorrei scrivere la tua dichiarazione SQL, ma ci vorranno alcuni minuti.

0

Qualcosa di simile:

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

o full data

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

O il vostro brutto sintassi (:))

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) 

O volete solo l'anno? Somma tutte le colonne? O solo per anno?

+0

Somma della colonna Qtotale raggruppata per anno nella colonna TDateTime. Conta della colonna TDateTime duplicata. – ARK

1

Ciò funzionerà se si vuole veramente di gruppo dalla colonna tDateTime:

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

Ma i risultati guarda come si desidera raggruppare entro l'anno nella colonna tDateTime. È corretto?

Se è così provare questo:

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

Sì, lo desidero raggruppato in base all'anno nella colonna TDateTime. – ARK

+0

Date un'occhiata al mio aggiornamento –

+0

wont questo include le righe che non hanno righe duplicate? il risultato della query dovrebbe visualizzare solo il conteggio duplicato, escludendo le righe distinte. – 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

Penso che tu abbia risposto alla domanda come detto, ma penso che la vera domanda sia sbagliata. Come viene mostrato, i dati restituiti sono denormalizzati. Mostra lo stesso COUNT per ogni riga, con un valore che è indicativo dell'intera popolazione piuttosto che dell'anno del gruppo. Penso che la subquery interna debba essere cambiata in una subquery correlata, filtrando su "year (Tdatetime)". –

0

Questa è la prima volta che ho fatto una domanda su StackOverflow. Sembra che abbia perso le mie informazioni ID originali. Ho dovuto registrarmi per accedere e aggiungere commenti alla domanda che ho postato.

Per rispondere alla domanda di OMG Ponies, questo è un database di SQL Server 2008. @Abe Miessler, la riga con SID 120 non contiene duplicati. la prima riga per SID 120 mostra 9:00 AM nella colonna datetime e la seconda riga indica 10:00 AM.

@Zafer, la tua richiesta è la risposta accettata. Ho apportato alcune modifiche minori per farlo funzionare. Grazie. Grazie a Abe Miessler e agli altri per il vostro aiuto.

+0

È necessario contrassegnare la risposta accettata come accettata. – RickF

Problemi correlati