SQL Server UNION拼接Group by查询后按日期去重分组问题求助
解决UNION拼接查询后日期重复的分组问题
问题说明
对两个通过UNION拼接的SELECT查询结果按Data列分组时,出现了重复的同日期值,需要实现同一日期仅返回一行数据的效果。
原因分析
- 原始子查询的GROUP BY维度是完整的
E3TimeStamp时间戳(包含时分秒),同一天内不同时间点的数据会被拆分为独立行 - UNION仅对整行所有字段值完全一致的行进行去重,两个子查询返回的同一日期、但指标值不同的行无法被去重,因此出现日期重复
实现方案
将现有UNION整体作为内层子查询,外层按日期维度做二次聚合即可,建议将UNION替换为UNION ALL,避免不必要的去重开销,提升查询性能。
修改后完整代码
SELECT CAST(t.Data AS DATE) AS Data, ROUND(SUM(t.PH_07),2) AS PH_07, ROUND(SUM(t.PH_08),2) AS PH_08, ROUND(SUM(t.PH_09),2) AS PH_09, ROUND(SUM(t.MDS),2) AS MDS, ROUND(SUM(t.MCCMP),2) AS MCCMP, ROUND(SUM(t.MDCMP),2) AS MDCMP, ROUND(SUM(t.MCF),2) AS MCF, ROUND(SUM(t.MDF),2) AS MDF, ROUND(SUM(t.ESC_04),2) AS ESC_04, ROUND(SUM(t.ESC_RET),2) AS ESC_RET FROM ( SELECT Tab_Dados_Producao.E3TimeStamp AS Data, ROUND(SUM(CASE WHEN Tab_Dados_Producao.Maquina = 'PH_07' THEN Tab_Dados_Producao.Valor ELSE 0 END),2) As 'PH_07', ROUND(SUM(CASE WHEN Tab_Dados_Producao.Maquina = 'PH_08' THEN Tab_Dados_Producao.Valor ELSE 0 END),2) As 'PH_08', ROUND(SUM(CASE WHEN Tab_Dados_Producao.Maquina = 'PH_09' THEN Tab_Dados_Producao.Valor ELSE 0 END),2) As 'PH_09', ROUND(SUM(CASE WHEN Tab_Dados_Producao.Maquina = 'MDS' THEN Tab_Dados_Producao.Valor ELSE 0 END),2) As 'MDS', ROUND(SUM(CASE WHEN Tab_Dados_Producao.Maquina = 'MCCMP' THEN Tab_Dados_Producao.Valor ELSE 0 END),2) As 'MCCMP', ROUND(SUM(CASE WHEN Tab_Dados_Producao.Maquina = 'MDCMP'THEN Tab_Dados_Producao.Valor ELSE 0 END),2) As 'MDCMP', ROUND(SUM(CASE WHEN Tab_Dados_Producao.Maquina = 'MCF'THEN Tab_Dados_Producao.Valor ELSE 0 END),2) As 'MCF', ROUND(SUM(CASE WHEN Tab_Dados_Producao.Maquina = 'MDF' THEN Tab_Dados_Producao.Valor ELSE 0 END),2) As 'MDF', ROUND(SUM(CASE WHEN Tab_Dados_Producao.Maquina = 'ESC_04' THEN Tab_Dados_Producao.Valor ELSE 0 END),2) As 'ESC_04', ROUND(SUM(CASE WHEN Tab_Dados_Producao.Maquina = 'ESC_RET' THEN Tab_Dados_Producao.Valor ELSE 0 END),2) As 'ESC_RET' FROM [E3_CERAL].[dbo].[Tab_Dados_Producao] WHERE MONTH((Tab_Dados_Producao.E3TimeStamp)) = '8' AND DAY((Tab_Dados_Producao.E3TimeStamp)) = '16' GROUP BY Tab_Dados_Producao.E3TimeStamp UNION ALL SELECT Tab_Dados_Escolha.E3TimeStamp AS Data, ROUND(SUM(CASE WHEN Tab_Dados_Escolha.Maquina = 'PH_07' THEN Tab_Dados_Escolha.Metrica ELSE 0 END),2) As 'PH_07', ROUND(SUM(CASE WHEN Tab_Dados_Escolha.Maquina = 'PH_08' THEN Tab_Dados_Escolha.Metrica ELSE 0 END),2) As 'PH_08', ROUND(SUM(CASE WHEN Tab_Dados_Escolha.Maquina = 'PH_09' THEN Tab_Dados_Escolha.Metrica ELSE 0 END),2) As 'PH_09', ROUND(SUM(CASE WHEN Tab_Dados_Escolha.Maquina = 'MDS' THEN Tab_Dados_Escolha.Metrica ELSE 0 END),2) As 'MDS', ROUND(SUM(CASE WHEN Tab_Dados_Escolha.Maquina = 'MCCMP' THEN Tab_Dados_Escolha.Metrica ELSE 0 END),2) As 'MCCMP', ROUND(SUM(CASE WHEN Tab_Dados_Escolha.Maquina = 'MDCMP'THEN Tab_Dados_Escolha.Metrica ELSE 0 END),2) As 'MDCMP', ROUND(SUM(CASE WHEN Tab_Dados_Escolha.Maquina = 'MCF'THEN Tab_Dados_Escolha.Metrica ELSE 0 END),2) As 'MCF', ROUND(SUM(CASE WHEN Tab_Dados_Escolha.Maquina = 'MDF' THEN Tab_Dados_Escolha.Metrica ELSE 0 END),2) As 'MDF', ROUND(SUM(CASE WHEN Tab_Dados_Escolha.Maquina = 'ESC_04' THEN Tab_Dados_Escolha.Metrica ELSE 0 END),2) As 'ESC_04', ROUND(SUM(CASE WHEN Tab_Dados_Escolha.Maquina = 'ESC_RET' THEN Tab_Dados_Escolha.Metrica ELSE 0 END),2) As 'ESC_RET' FROM [E3_CERAL].[dbo].[Tab_Dados_Escolha] WHERE MONTH((Tab_Dados_Escolha.E3TimeStamp)) = '8' AND DAY((Tab_Dados_Escolha.E3TimeStamp)) = '16' GROUP BY Tab_Dados_Escolha.E3TimeStamp ) t GROUP BY CAST(t.Data AS DATE)
原始查询结果示意图

内容的提问来源于stack exchange,提问作者Vitor Marques Lourenço
相关产品推荐
相关产品推荐

