SQL 数据透视查询中的服务器行总计

SQL Server Row totals in pivot query

我试图在结果集的末尾添加一行以显示总数。

我的查询是这样的:

SELECT 
[ ] = ISNULL(CAST(GEN_idPaciente AS VARCHAR)+'-'+nombrePaciente, 'TOTAL'),
[2016-11-01] = MAX([2016-11-01]),
[2016-11-02] = MAX([2016-11-02]),
[2016-11-03] = MAX([2016-11-03]),
[2016-11-04] = MAX([2016-11-04]),
TOTAL = COUNT([2016-11-01]) + COUNT([2016-11-02]) + COUNT([2016-11-03]) + COUNT([2016-11-04])
FROM 
(
    SELECT GEN_Paciente.GEN_idPaciente,COALESCE(GEN_ape_paternoPaciente, '')+' '+COALESCE(GEN_ape_maternoPaciente, '')+' '+COALESCE(GEN_nombrePaciente, '') AS nombrePaciente,HOS_fechaCategorizacion,HOS_nivel_riesgoCategorizacion+CAST(HOS_nivel_dependenciaCategorizacion AS VARCHAR) as riesgoDependencia
    FROM HOS_Categorizacion
    INNER JOIN HOS_Hospitalizacion
    ON HOS_Hospitalizacion.HOS_idHospitalizacion = HOS_Categorizacion.HOS_idHospitalizacion
    INNER JOIN GEN_Paciente
    ON GEN_Paciente.GEN_idPaciente = HOS_Hospitalizacion.GEN_idPaciente
    WHERE HOS_nivel_riesgoCategorizacion IS NOT NULL
) src
PIVOT
(
  MAX(riesgoDependencia)
  for HOS_fechaCategorizacion in ([2016-11-01],[2016-11-02],[2016-11-03],[2016-11-04])
) p
GROUP BY
ROLLUP(CAST(GEN_idPaciente AS VARCHAR)+'-'+nombrePaciente)

这给了我这个结果:

但是正如您所见,行的总计是正确的,但列的总计是错误的,因为我使用的是 MAX 而不是 COUNT,但我只需要在 TOTAL 行中使用 COUNT,其他行必须是 MAX ,所以我写了这个查询:

SELECT 
[ ] = ISNULL(CAST(GEN_idPaciente AS VARCHAR)+'-'+nombrePaciente, 'TOTAL'),
[2016-11-01] = CASE WHEN CAST(GEN_idPaciente AS VARCHAR)+'-'+nombrePaciente IS NOT NULL THEN MAX([2016-11-01]) ELSE COUNT([2016-11-01]) END,
[2016-11-02] = CASE WHEN CAST(GEN_idPaciente AS VARCHAR)+'-'+nombrePaciente IS NOT NULL THEN MAX([2016-11-02]) ELSE COUNT([2016-11-02]) END,
[2016-11-03] = CASE WHEN CAST(GEN_idPaciente AS VARCHAR)+'-'+nombrePaciente IS NOT NULL THEN MAX([2016-11-03]) ELSE COUNT([2016-11-03]) END,
[2016-11-04] = CASE WHEN CAST(GEN_idPaciente AS VARCHAR)+'-'+nombrePaciente IS NOT NULL THEN MAX([2016-11-04]) ELSE COUNT([2016-11-04]) END,
TOTAL = COUNT([2016-11-01]) + COUNT([2016-11-02]) + COUNT([2016-11-03]) + COUNT([2016-11-04])
FROM 
(
    SELECT GEN_Paciente.GEN_idPaciente,COALESCE(GEN_ape_paternoPaciente, '')+' '+COALESCE(GEN_ape_maternoPaciente, '')+' '+COALESCE(GEN_nombrePaciente, '') AS nombrePaciente,HOS_fechaCategorizacion,HOS_nivel_riesgoCategorizacion+CAST(HOS_nivel_dependenciaCategorizacion AS VARCHAR) as riesgoDependencia
    FROM HOS_Categorizacion
    INNER JOIN HOS_Hospitalizacion
    ON HOS_Hospitalizacion.HOS_idHospitalizacion = HOS_Categorizacion.HOS_idHospitalizacion
    INNER JOIN GEN_Paciente
    ON GEN_Paciente.GEN_idPaciente = HOS_Hospitalizacion.GEN_idPaciente
    WHERE HOS_nivel_riesgoCategorizacion IS NOT NULL
) src
PIVOT
(
  MAX(riesgoDependencia)
  for HOS_fechaCategorizacion in ([2016-11-01],[2016-11-02],[2016-11-03],[2016-11-04])
) p
GROUP BY
ROLLUP(CAST(GEN_idPaciente AS VARCHAR)+'-'+nombrePaciente)

但这不起作用

感谢您的帮助!!

如果我理解正确的话,你想计算所有不为空的列。在这种情况下,您应该只查看条件 IS NULL 而不是实际值。试试这个:

DECLARE @tbl TABLE(ID INT IDENTITY, val1 VARCHAR(100),val2 VARCHAR(100),val3 VARCHAR(100));

INSERT INTO @tbl VALUES
 ('row1_val1','row1_val2',NULL)
,('row2_val1','row2_val2','row2_val3')
,(NULL,'row2_val2',NULL)
,(NULL,NULL,'row2_val3')
,(NULL,NULL,NULL);

SELECT *
      ,CASE WHEN val1 IS NULL THEN 0 ELSE 1 END 
      +CASE WHEN val2 IS NULL THEN 0 ELSE 1 END
      +CASE WHEN val3 IS NULL THEN 0 ELSE 1 END AS CountOfValNotNull
FROM @tbl

更新:添加最终的 Totals Row

您需要对 CTE、一个额外的排序列、UNION ALL 添加另一行和 sub_select 进行丑陋的摆弄。

使用最外层的ORDER BY得到人工的Totals-Row到最后

提示:使用上面的@tbl变量!

WITH SortedRows AS
(
    SELECT ROW_NUMBER() OVER(ORDER BY ID) AS SortColumn
          ,*
          ,CASE WHEN val1 IS NULL THEN 0 ELSE 1 END 
          +CASE WHEN val2 IS NULL THEN 0 ELSE 1 END
          +CASE WHEN val3 IS NULL THEN 0 ELSE 1 END AS CountOfValNotNull
    FROM @tbl
)

SELECT tbl1.*
FROM
(
    SELECT * FROM SortedRows
    UNION ALL
    SELECT 999999,0,'','','',(SELECT SUM(CountOfValNotNull) FROM SortedRows)
) AS tbl1
ORDER BY tbl1.SortColumn