2010-09-09 32 views
5

Si los datos están en el formato siguiente:consulta SQL para encontrar suma de todas las filas y recuento de duplicados

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 

me gustaría ser capaz de escribir una consulta para resumir la columna de la Qtotal para todas las filas y encontrar el recuento de filas duplicadas para la columna Tdatetime.

La salida se vería así:

Year Total Count
97 | 1340 | 4
La tercera columna en el resultado no incluye el recuento de filas distintas en la tabla. Y la salida se agrupa por año en la columna TDateTime.

+1

¿Para qué base de datos? –

+0

No estoy seguro de qué información de base de datos necesitaría. – ARK

+0

Él pregunta qué es DBMS. SQL Server, Oracle, MySql, etc. –

Respuesta

0

La consulta siguiente puede ayudar:

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

Esta consulta no parece funcionar para la situación presentada anteriormente. – ARK

+0

He actualizado el código. – Zafer

+0

Sé que esta es una vieja pregunta, pero para cualquier otra persona que la encuentre: 'TENER COUNT (Tdatetime)> 2' probablemente debería ser'> 1' o '> = 2', de lo contrario no encontrará nada donde haya un recuento de 2 – laurencemadill

0

Debe hacer SELECCIONAR de esta tabla AGRUPAR por QTotal, usar COUNT (SUBSELECCIONAR desde esta tabla DONDE QTotal es el mismo). Si solo tuviera tiempo, escribiría una declaración SQL, pero tomaría algunos minutos.

0

Algo así como:

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

o total fecha

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

O su sintaxis fea (:))

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 quieres que tan sólo el año? ¿Suma todas las columnas? ¿O solo por año?

+0

Suma de la columna Qtotal agrupada por año en la columna TDateTime. Recuento de columna TDateTime duplicada. – ARK

1

Esto funcionará si realmente desea agrupar por la columna de tDateTime:

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

Pero sus resultados pareces desea agrupar por el Año de la columna tDateTime. ¿Es esto correcto?

Si es así intente esto:

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

Sí, lo quiero agrupar por año en la columna TDateTime. – ARK

+0

Eche un vistazo a mi actualización –

+0

¿Esto no incluye las filas que no tienen filas duplicadas? el resultado de la consulta solo debe mostrar el recuento duplicado, excluyendo las distintas filas. – 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

Creo que ha respondido la pregunta tal como se indicó, pero creo que la pregunta real es incorrecta. Como esto se muestra, los datos devueltos se desnormalizan. Está mostrando el mismo COUNT para cada fila, con un valor que es indicativo de toda la población en lugar del año del grupo. Creo que la subconsulta interna debe cambiarse a una subconsulta correlacionada, filtrando en "year (Tdatetime)". –

0

Esta es la primera vez que he hecho una pregunta en StackOverflow. Parece que he perdido la información de mi ID original. Tuve que registrarme para iniciar sesión y agregar comentarios a la pregunta que publiqué.

Para responder a la pregunta de OMG Ponies, esta es una base de datos de SQL Server 2008. @Abe Miessler, la fila con SID 120 no contiene duplicados. la primera fila para SID 120 muestra 9:00 AM en la columna de fecha y hora, y la segunda fila muestra 10:00 AM.

@ Zafer, su consulta es la respuesta aceptada. Hice algunos ajustes menores para que funcione. Gracias. Gracias a Abe Miessler y a los demás por su ayuda.

+0

Debe marcar la respuesta aceptada como aceptada. – RickF

Cuestiones relacionadas