2010-09-26 13 views
6

Tengo una consulta que suma todos los casos que estuvieron activos el 01/01/2010.SQL Server Consultar totales mensuales

SELECT  COUNT(CaseID) AS Total 
FROM   dbo.ClientCase 
WHERE  (CaseStartDate <= CONVERT(DATETIME, '2010-01-01 00:00:00', 102)) AND (CaseClosedDate >= CONVERT(DATETIME, '2010-01-01 00:00:00', 102)) OR (CaseClosedDate IS NULL) 
GROUP BY CaseStartDate 

También tengo una mesa Calendario que puedo usar para crear una consulta que devuelve 12 fechas de inicio desde el 1 de Ene, 1 de Feb, 1 de Mar a través de al 1 de diciembre

no puedo hacer ejercicio cómo combinar las 2 consultas para obtener un recuento de todos los totales de casos para el 1 de cada mes.

tengo que ver algo como

Month Total 
Jan  102 
Feb  130 
Mar  145 
..... 
Dec  162 
+1

podría indicar lo que está tratando de lograr con esta consulta? Lo primero que pensé es que es posible que no necesite la tabla Calendario y, en su lugar, podría usar funciones de fecha SQL (MES, AÑO, etc.). –

+0

@adrift - Tengo una variedad de consultas que resuelven cuántos casos estuvieron abiertos al comienzo de un mes, cuántos casos se cerraron durante un mes y cuántos se crearon durante un mes. Si miras mi primer ejemplo arriba que totaliza casos abiertos, hace lo que quiero pero solo para el 1 de enero de 2010. Necesito las fechas en la primera consulta para iterar a través de los otros 11 meses del año. – Mitch

Respuesta

5
SELECT cal.MonthName, COUNT(CaseID) AS Total 
FROM dbo.calendarTable cal 
LEFT OUTER JOIN dbo.ClientCase cc 
ON Month(cal.MonthStartDate) = Month(CaseStartDate) 
WHERE 
(CaseStartDate <= CONVERT(DATETIME, cal.MonthStartDate, 102)) AND 
(CaseClosedDate >= CONVERT(DATETIME, cal.MonthStartDate, 102)) OR 
(CaseClosedDate IS NULL) 
GROUP BY cal.MonthName 
  • externa izquierda a asegúrese de obtener todos los meses, incluso con 0 casos
+0

Su respuesta fue la más cercana a la que necesitaba tantas gracias por su ayuda. – Mitch

2

Suponiendo calendario tiene dos columnas como MonthName y FirstDate, desea s/cosa como

SELECT Calendar.MonthName AS Month, COUNT(ClientCase.CaseId) AS Total, 
    FROM ClientCase 
    JOIN Calendar 
    ON (MONTH(Calendar.FirstDate) = MONTH(ClientCase.CaseStartDate)) 
    GROUP BY Calendar.MonthName 
1

Usted podría simplemente grupo por el mes de la consulta:

SELECT 
    MONTH(CaseStartDate), COUNT(CaseID) AS Total 
FROM   
    dbo.ClientCase 
WHERE  
    (CaseStartDate <= CONVERT(DATETIME, '2010-01-01 00:00:00', 102)) 
    AND (CaseClosedDate >= CONVERT(DATETIME, '2010-01-01 00:00:00', 102)) OR 
     (CaseClosedDate IS NULL) 
GROUP BY 
    MONTH(CaseStartDate) 

que debe darle una salida que está bastante cerca (meses numéricos en lugar de enero, febrero, etc - pero lo suficientemente cerca).

Con este paso adicional, obtendrá los tres primeros de del nombre de cada mes letra:

SELECT 
    SUBSTRING(DATENAME(MONTH, CaseStartDate), 1, 3) AS 'Month', 
    COUNT(CaseID) AS Total 
FROM   
    dbo.ClientCase 
WHERE  
    (CaseStartDate <= CONVERT(DATETIME, '2010-01-01 00:00:00', 102)) 
    AND (CaseClosedDate >= CONVERT(DATETIME, '2010-01-01 00:00:00', 102)) OR 
     (CaseClosedDate IS NULL) 
GROUP BY 
    MONTH(CaseStartDate), SUBSTRING(DATENAME(MONTH, CaseStartDate), 1, 3) 
ORDER BY 
    MONTH(CaseStartDate) 
Cuestiones relacionadas