如何在 SQL 服务器中将 'group by' 的 2 个查询显示为一个
How to show 2 queries with 'group by' as one in SQL Server
我正在尝试将两个查询的结果与两个相等的列合并(查询有 2 Group by
)。
我已经尝试使用 Union
和 Join
语句,但没有给出想要的结果,或者我用错了它们
查询 #1:
SELECT
COD_RCA, COD_MATERIAL, SUM(TM_SALIDA) AS INCLUIR
FROM
BASE_MESES
WHERE
PONDERADA = 'INCLUIR' AND ANO = '2017' AND MES = 'DEZ'
GROUP BY
COD_RCA, COD_MATERIAL
查询#2:
SELECT
COD_RCA, COD_MATERIAL, SUM(REAL_TM) AS TOTAL
FROM
BASE_MESES
WHERE
ANO = '2017' AND MES = 'DEZ'
GROUP BY
COD_RCA, COD_MATERIAL
我需要这样的东西:
其中 COD_RCA
和 COD_MATERIAL
是查询 #1 和查询 #2 之间的关系。
谢谢
您可以使用条件聚合:
SELECT COD_RCA,COD_MATERIAL
,SUM(IIF( PONDERADA='INCLUIR',TM_SALIDA,0)) AS INCLUIR
,SUM(REAL_TM) AS TOTAL
FROM BASE_MESES
WHERE ANO ='2017' AND MES='DEZ'
GROUP BY COD_RCA, COD_MATERIAL;
如果我没记错的话,您的两个查询可以在很大程度上分解,因为其中一个查询与另一个查询非常接近。您只需要一个 CASE 来计算 « INCLUIR » 结果列。
SELECT
COD_RCA,
COD_MATERIAL,
SUM(CASE
WHEN PONDERADA='INCLUIR' THEN TM_SALID ELSE 0 END
) AS INCLUIR,
SUM(REAL_TM) AS TOTAL
FROM BASE_MESES
WHERE
ANO ='2017'
AND MES='DEZ'
GROUP BY
COD_RCA,
COD_MATERIAL
试试这个(但最好的解决方案是 Lukasz Szozda 的解决方案):
With quer1 as
(
SELECT COD_RCA, COD_MATERIAL,SUM(TM_SALIDA) AS INCLUIR
FROM BASE_MESES
WHERE PONDERADA='INCLUIR' AND ANO ='2017' AND MES='DEZ'
GROUP BY COD_RCA, COD_MATERIAL
),
Query2 as (
SELECT COD_RCA, COD_MATERIAL,SUM(REAL_TM) AS TOTAL
FROM BASE_MESES
WHERE ANO ='2017' AND MES='DEZ'
GROUP BY COD_RCA, COD_MATERIAL
)
select isnull(f1.COD_RCA, f2.COD_RCA) COD_RCA,
isnull(f1.COD_MATERIAL, f2.COD_MATERIAL) COD_MATERIAL,
f1.INCLUIR, f2.TOTAL
from quer1 f1
full outer join Query2 f2 on f1.COD_RCA=f2.COD_RCA and f1.COD_MATERIAL=f2.COD_MATERIAL
我正在尝试将两个查询的结果与两个相等的列合并(查询有 2 Group by
)。
我已经尝试使用 Union
和 Join
语句,但没有给出想要的结果,或者我用错了它们
查询 #1:
SELECT
COD_RCA, COD_MATERIAL, SUM(TM_SALIDA) AS INCLUIR
FROM
BASE_MESES
WHERE
PONDERADA = 'INCLUIR' AND ANO = '2017' AND MES = 'DEZ'
GROUP BY
COD_RCA, COD_MATERIAL
查询#2:
SELECT
COD_RCA, COD_MATERIAL, SUM(REAL_TM) AS TOTAL
FROM
BASE_MESES
WHERE
ANO = '2017' AND MES = 'DEZ'
GROUP BY
COD_RCA, COD_MATERIAL
我需要这样的东西:
其中 COD_RCA
和 COD_MATERIAL
是查询 #1 和查询 #2 之间的关系。
谢谢
您可以使用条件聚合:
SELECT COD_RCA,COD_MATERIAL
,SUM(IIF( PONDERADA='INCLUIR',TM_SALIDA,0)) AS INCLUIR
,SUM(REAL_TM) AS TOTAL
FROM BASE_MESES
WHERE ANO ='2017' AND MES='DEZ'
GROUP BY COD_RCA, COD_MATERIAL;
如果我没记错的话,您的两个查询可以在很大程度上分解,因为其中一个查询与另一个查询非常接近。您只需要一个 CASE 来计算 « INCLUIR » 结果列。
SELECT
COD_RCA,
COD_MATERIAL,
SUM(CASE
WHEN PONDERADA='INCLUIR' THEN TM_SALID ELSE 0 END
) AS INCLUIR,
SUM(REAL_TM) AS TOTAL
FROM BASE_MESES
WHERE
ANO ='2017'
AND MES='DEZ'
GROUP BY
COD_RCA,
COD_MATERIAL
试试这个(但最好的解决方案是 Lukasz Szozda 的解决方案):
With quer1 as
(
SELECT COD_RCA, COD_MATERIAL,SUM(TM_SALIDA) AS INCLUIR
FROM BASE_MESES
WHERE PONDERADA='INCLUIR' AND ANO ='2017' AND MES='DEZ'
GROUP BY COD_RCA, COD_MATERIAL
),
Query2 as (
SELECT COD_RCA, COD_MATERIAL,SUM(REAL_TM) AS TOTAL
FROM BASE_MESES
WHERE ANO ='2017' AND MES='DEZ'
GROUP BY COD_RCA, COD_MATERIAL
)
select isnull(f1.COD_RCA, f2.COD_RCA) COD_RCA,
isnull(f1.COD_MATERIAL, f2.COD_MATERIAL) COD_MATERIAL,
f1.INCLUIR, f2.TOTAL
from quer1 f1
full outer join Query2 f2 on f1.COD_RCA=f2.COD_RCA and f1.COD_MATERIAL=f2.COD_MATERIAL