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.
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í:
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í: