es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Utilice la función rollup para calcular los totales generales con agrupamiento.

Tengo un procedimiento almacenado:

ALTER PROCEDURE GetReportData
AS
BEGIN
    SELECT 
        LOC.SubCompanyNameVN,
        LOC.BranchName,
        COUNT(LOC.BranchCode) AS Total,

    ----------- No procesado aún
    SUM(CASE WHEN SS.Status IN (5, 6) THEN 1 ELSE 0 END) AS CountNotProcessedYet,

    ----------- Procesando
    SUM(CASE WHEN SS.Status IN (3) THEN 1 ELSE 0 END) AS CountProcessing

FROM 
    DBO.WorkingSession AS SS
JOIN 
    DBO.Location AS LOC ON SS.LocationID = LOC.LocationID 
                        AND SS.BranchCode = LOC.BranchCode
JOIN 
    DBO.Status AS ST ON SS.Status = ST.ID
GROUP BY 
    ROLLUP(LOC.SubCompanyNameVN, LOC.BranchName)
ORDER BY 
    LOC.SubCompanyNameVN

El resultado:

SubCompanyNameVN BranchName Total CountNotProcessedYet CountProcessing
Vùng 1 HNI01 5 3 2
Vùng 1 HNI02 15 5 10
Vùng 1 HNI07 12 6 6
Vùng 2 HCM01 86 50 36
Vùng 2 HCM_03 35 17 18

Pero ahora espero que mi resultado sea:

SubCompanyOrBranchName Total CountNotProcessedYet CountProcessing
Vùng 1 32 14 18
HNI01 5 3 2
HNI02 15 5 10
HNI07 12 6 6
Vùng 2 121 67 54
HCM01 86 50 36
HCM_03 35 17 18

¿Cómo puedo agrupar los resultados por la columna SubCompanyNameVN (Group By SubCompanyNameVN) para calcular el total como en la tabla anterior? He investigado y creo que puedo resolverlo con ROLLUP, pero estoy confundido al respecto.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado deseado, se puede utilizar la función ROLLUP en SQL. ROLLUP proporciona una forma de obtener subtotales y totales generales en un único conjunto de resultados mediante la generación de múltiples conjuntos de agrupación.

    Su nuevo procedimiento almacenado se vería así:

    ALTER PROCEDURE GetReportData
    AS
    BEGIN
        SELECT 
            CASE 
                WHEN GROUPING(LOC.SubCompanyNameVN) = 1 THEN '     ' + LOC.SubCompanyNameVN 
                ELSE LOC.BranchName 
            END AS SubCompanyOrBranchName,
    
            COUNT(LOC.BranchCode) as Total,
            SUM (CASE WHEN SS.Status IN (5, 6) THEN 1 ELSE 0 END) AS CountNotProcessedYet,        
            SUM (CASE WHEN SS.Status IN (3) THEN 1 ELSE 0 END) AS CountProcessing        
        FROM 
            DBO.WorkingSession AS SS
        JOIN 
            DBO.Location AS LOC ON SS.LocationID = LOC.LocationID 
                                AND SS.BranchCode = LOC.BranchCode
        JOIN 
            DBO.Status AS ST ON SS.Status = ST.ID
        GROUP BY 
            ROLLUP(LOC.SubCompanyNameVN, LOC.BranchName)
        ORDER BY 
            CASE 
                WHEN GROUPING(LOC.SubCompanyNameVN) = 1 THEN 'ZZZZZZZZ' 
                ELSE LOC.SubCompanyNameVN 
            END,
            GROUPING(LOC.BranchName), 
            LOC.BranchName
    END
    

    En la instrucción SELECT, utilizamos una declaración CASE junto con la función GROUPING para determinar si debemos mostrar SubCompanyNameVN o BranchName en el conjunto de resultados. También agregamos espacios a SubCompanyNameVN para resaltarla en el conjunto de resultados.

    La función ROLLUP se utiliza en la cláusula GROUP BY para generar filas de subtotales y totales generales. La cláusula ORDER BY se utiliza para ordenar el conjunto de resultados en el orden deseado.

    Con ROLLUP, el conjunto de resultados incluiría 3 conjuntos de agrupación: uno para cada BranchName, uno para cada SubCompanyNameVN y uno para el total general. Las filas de subtotal de SubCompanyNameVN se identifican al tener un valor NULL en la columna BranchName.

    El conjunto de resultados se vería así:

    | SubCompanyOrBranchName | Total | CountNotProcessedYet | CountProcessing |
    | ------:| -----:| -----:| -----:|
    | Vùng 1 | 32 | 14 | 18 |
    |      HNI_01 | 5 | 3 | 2 |
    |      HNI_02 | 15 | 5 | 10 |
    |      HNI_07 | 12 | 6 | 6 |
    |          |    |    |    |
    | Vùng 2 | 121 | 67 | 54 |
    |      HCM_01 | 86 | 50 | 36 |
    |      HCM_03 | 35 | 17 | 18 |
    |          |    |    |    |
    |          | 153 | 81 | 72 |
    

Comments are closed.