在数据透视查询中的SQL Server行总计

时间:2016-11-06 21:00:24

标签: sql-server-2008 pivot rows

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

我的疑问是:

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)

这给了我这个结果:

enter image description here

但是正如你可以看到行的总数是正确的但是列的总数是错误的,因为我使用的是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)

但那不起作用

enter image description here

感谢您的帮助!!

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你想要计算所有非空的列。在这种情况下,您应该只查看条件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

更新:添加最终的总计

您需要使用CTE(另外一个排序列{J}添加另一行和一个sub_select)进行丑陋的摆弄。

使用最外层的UNION ALL将人工总计行放到最后

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

ORDER BY
相关问题