2009-07-16 15 views
5

Tengo la siguiente consulta:Contar filas totales con un grupo de

select count(ords.TRACKING_NUM) 
from Orders ords (NoLock) 
group by ords.TRACKING_NUM 
having count(distinct ords.ORDER_NUM) = 4 

lo quiero para recuperar la cantidad total de TRACKING_NUMs que tienen 4 ORDER_NUMs en ellos (debe ser de 3352). En cambio, obtengo 3.352 filas iguales a 4 (o más debido a lo distinto).

Entiendo por qué sucede esto. Está contando los valores dentro de cada grupo por. Y puedo cambiar fácilmente la consulta a este:

select ords.TRACKING_NUM 
from Orders ords (NoLock) 
group by ords.TRACKING_NUM 
having count(distinct ords.ORDER_NUM) = 4 

y luego obtener 3.352 filas de TRACKING_NUMs volvieron a mí. Sin embargo, esto no es muy efectivo en mi base de datos (tarda unos 41 segundos). Lo que realmente necesito es una consulta que me dé un conteo y solo un conteo (y al hacerlo espero que vaya más rápido).

Gracias por cualquier sugerencia.

Respuesta

13
SELECT COUNT(*) 
FROM (
    SELECT TRACKING_NUM 
    FROM Orders 
    GROUP BY TRACKING_NUM 
    HAVING count(distinct ORDER_NUM) = 4) AS Agg 
+0

Al ejecutar esto en SSMS aparece el siguiente error: Msg 170, nivel 15, estado 1, línea 7 Línea 7: sintaxis incorrecta cerca de ')'. – Vaccano

+0

Si lo ejecuto en ApexSQL Edit obtengo este error: Msg 156, Nivel 15, Estado 1, Ocurrió en línea: 10 Sintaxis incorrecta cerca de la palabra clave 'set'. – Vaccano

+0

Sí, las tablas derivadas necesitan un alias –

2
SELECT OrderCount AS 'Total Orders', COUNT(TRACKING_NUM) AS 'Tracking Num Count' 
FROM (
    SELECT DISTINCT TRACKING_NUM, COUNT(DISTINCT ORDER_NUM) AS 'OrderCount' 
    FROM Orders 
    GROUP BY TRACKING_NUM 
) AS tblOrdersPerTrackingNum 

Esto le dará sólo el recuento de sus TRACKING_NUMs como usted quería, y también obtener los recuentos para cada otra cantidad de pedidos totales (no sólo tener recuento order = 4).

(Parece que su consulta es para algún tipo de informe, si ese es el caso, y si se ejecutará a menudo donde el rendimiento es una preocupación, como sugirió, también podría obtener todos sus valores de una consulta, en lugar de cambiar o parametrizar el recuento que le interesa y volver a ejecutarlo varias veces (incluso si eso fuera automático). Mucho mejor para dejar que el servidor lo haga todo por usted una vez. Perdone mi suposición si eso no es para lo que estabas trabajando.)

Sé que eso no es exactamente lo que preguntaste ... Remus Rusanu ya lo entendió, pero pediste "cualquier sugerencia".

Cuestiones relacionadas