Sql 将结果求和为一个并集
我在SQL中有以下查询Sql 将结果求和为一个并集,sql,sql-server,Sql,Sql Server,我在SQL中有以下查询 SELECT cast(A.CodigoArticulo as varchar) CodArticulo , cast(ap.Codigo as varchar ) CodArtProveedor , dlp.Precio Publico , 0 Interior from Articulos a join ArticuloProveedores ap on ap.ArticuloId = a.Id join DetallesListaPrecios D
SELECT cast(A.CodigoArticulo as varchar) CodArticulo
, cast(ap.Codigo as varchar ) CodArtProveedor
, dlp.Precio Publico
, 0 Interior
from Articulos a
join ArticuloProveedores ap on ap.ArticuloId = a.Id
join DetallesListaPrecios DLP on DLP.ArticuloId = A.Id
join ListasPrecios lp on lp.Id = dlp.ListaPreciosId
where lp.Id in ('1')
union all
SELECT cast(A.CodigoArticulo as varchar) CodArticulo
, cast(ap.Codigo as varchar ) CodArtProveedor
, 0
, dlp.Precio
FROM Articulos a
join ArticuloProveedores ap on ap.ArticuloId = a.Id
join DetallesListaPrecios DLP on DLP.ArticuloId = A.Id
join ListasPrecios lp on lp.Id = dlp.ListaPreciosId
where lp.Id in ('4')
我得到的结果如下:
CodArticulo CodArtProveedor Publico Interior
44380 K-7 697 0
44380 K-7 0 767
00003 IM2757 0 2030
00003 IM2757 1845 0
00006 MTRJ6 156 0
00006 MTRJ6 0 172
00010 BERJ6 156 0
00010 BERJ6 0 172
我需要SUM()
列PUBLICO
和INTERIOR
。我希望我的输出如下
CodArticulo CodArtProveedor Publico Interior
44380 K-7 697 767
00003 IM2757 1845 2030
00006 MTRJ6 156 172
00010 BERJ6 156 172
建议使用哪些方法来获得预期的输出?我建议将这些联合结果输入临时表
#tempResults
,然后使用分组依据和求和
select CodArticulo, CodArtProveedor,SUM(Publico) ,SUM(Interior) from ##tempResults
group by CodArticulo,CodArtProveedor
我建议将这些联合结果输入临时表##tempResults
,然后使用分组依据
和总和
select CodArticulo, CodArtProveedor,SUM(Publico) ,SUM(Interior) from ##tempResults
group by CodArticulo,CodArtProveedor
两个可能答案中的第一个:
将联合查询放在公共表表达式或子查询中,然后将GROUPBY条件放在外部。示例如下:
SELECT CodArticulo
,CodArtProveedor
,SUM(Publico) as TotalPublico
,SUM(Interior) as TotalInterior
FROM (
SELECT cast(A.CodigoArticulo as varchar) CodArticulo
,cast(ap.Codigo as varchar ) CodArtProveedor
,dlp.Precio Publico
,0 Interior
FROM Articulos a
JOIN ArticuloProveedores ap ON ap.ArticuloId = a.Id
JOIN DetallesListaPrecios DLP ON DLP.ArticuloId = A.Id
JOIN ListasPrecios lp ON lp.Id = dlp.ListaPreciosId
WHERE lp.Id in ('1')
UNION ALL
SELECT cast(A.CodigoArticulo as varchar) CodArticulo
,cast(ap.Codigo as varchar ) CodArtProveedor
,0
,dlp.Precio
FROM Articulos a
JOIN ArticuloProveedores ap ON ap.ArticuloId = a.Id
JOIN DetallesListaPrecios DLP ON DLP.ArticuloId = A.Id
JOIN ListasPrecios lp ON lp.Id = dlp.ListaPreciosId
WHERE lp.Id in ('4')
) d
GROUP BY CodArticulo, CodArtProveedor
两个可能答案中的第一个:
将联合查询放在公共表表达式或子查询中,然后将GROUPBY条件放在外部。示例如下:
SELECT CodArticulo
,CodArtProveedor
,SUM(Publico) as TotalPublico
,SUM(Interior) as TotalInterior
FROM (
SELECT cast(A.CodigoArticulo as varchar) CodArticulo
,cast(ap.Codigo as varchar ) CodArtProveedor
,dlp.Precio Publico
,0 Interior
FROM Articulos a
JOIN ArticuloProveedores ap ON ap.ArticuloId = a.Id
JOIN DetallesListaPrecios DLP ON DLP.ArticuloId = A.Id
JOIN ListasPrecios lp ON lp.Id = dlp.ListaPreciosId
WHERE lp.Id in ('1')
UNION ALL
SELECT cast(A.CodigoArticulo as varchar) CodArticulo
,cast(ap.Codigo as varchar ) CodArtProveedor
,0
,dlp.Precio
FROM Articulos a
JOIN ArticuloProveedores ap ON ap.ArticuloId = a.Id
JOIN DetallesListaPrecios DLP ON DLP.ArticuloId = A.Id
JOIN ListasPrecios lp ON lp.Id = dlp.ListaPreciosId
WHERE lp.Id in ('4')
) d
GROUP BY CodArticulo, CodArtProveedor
我不完全熟悉您的数据模型,但是基于查询,在总和中放置一个条件可能允许您在一次传递中执行查询。在下面的示例中,执行单个select(无并集),并在SUM中使用CASE语句以获得所需的结果:
SELECT cast(A.CodigoArticulo as varchar) CodArticulo
,cast(ap.Codigo as varchar ) CodArtProveedor
,SUM(CASE WHEN '1' THEN dlp.Precio ELSE 0 END) Publico
,SUM(CASE WHEN '4' THEN dlp.Precio ELSE 0 END) Interior
FROM Articulos a
JOIN ArticuloProveedores ap ON ap.ArticuloId = a.Id
JOIN DetallesListaPrecios DLP ON DLP.ArticuloId = A.Id
JOIN ListasPrecios lp ON lp.Id = dlp.ListaPreciosId
WHERE lp.Id in ('1', '4')
GROUP BY A.CodigoArticulo, ap.Codigo
我不完全熟悉您的数据模型,但是基于查询,在总和中放置一个条件可能允许您在一次传递中执行查询。在下面的示例中,执行单个select(无并集),并在SUM中使用CASE语句以获得所需的结果:
SELECT cast(A.CodigoArticulo as varchar) CodArticulo
,cast(ap.Codigo as varchar ) CodArtProveedor
,SUM(CASE WHEN '1' THEN dlp.Precio ELSE 0 END) Publico
,SUM(CASE WHEN '4' THEN dlp.Precio ELSE 0 END) Interior
FROM Articulos a
JOIN ArticuloProveedores ap ON ap.ArticuloId = a.Id
JOIN DetallesListaPrecios DLP ON DLP.ArticuloId = A.Id
JOIN ListasPrecios lp ON lp.Id = dlp.ListaPreciosId
WHERE lp.Id in ('1', '4')
GROUP BY A.CodigoArticulo, ap.Codigo
我建议使用CTE
;WITH cte(CodArticulo,CodArtProveedor,Publico,Interior) AS
(SELECT cast(A.CodigoArticulo as varchar) CodArticulo
, cast(ap.Codigo as varchar ) CodArtProveedor
, dlp.Precio Publico
, 0 Interior
from Articulos a
join ArticuloProveedores ap on ap.ArticuloId = a.Id
join DetallesListaPrecios DLP on DLP.ArticuloId = A.Id
join ListasPrecios lp on lp.Id = dlp.ListaPreciosId
where lp.Id in ('1')
union all
SELECT cast(A.CodigoArticulo as varchar) CodArticulo
, cast(ap.Codigo as varchar ) CodArtProveedor
, 0
, dlp.Precio
FROM Articulos a
join ArticuloProveedores ap on ap.ArticuloId = a.Id
join DetallesListaPrecios DLP on DLP.ArticuloId = A.Id
join ListasPrecios lp on lp.Id = dlp.ListaPreciosId
where lp.Id in ('4'))
select CodArticulo,CodArtProveedor,SUM(Publico),Sum(Interior) from cte group by CodArticulo,CodArtProveedor
我建议使用CTE
;WITH cte(CodArticulo,CodArtProveedor,Publico,Interior) AS
(SELECT cast(A.CodigoArticulo as varchar) CodArticulo
, cast(ap.Codigo as varchar ) CodArtProveedor
, dlp.Precio Publico
, 0 Interior
from Articulos a
join ArticuloProveedores ap on ap.ArticuloId = a.Id
join DetallesListaPrecios DLP on DLP.ArticuloId = A.Id
join ListasPrecios lp on lp.Id = dlp.ListaPreciosId
where lp.Id in ('1')
union all
SELECT cast(A.CodigoArticulo as varchar) CodArticulo
, cast(ap.Codigo as varchar ) CodArtProveedor
, 0
, dlp.Precio
FROM Articulos a
join ArticuloProveedores ap on ap.ArticuloId = a.Id
join DetallesListaPrecios DLP on DLP.ArticuloId = A.Id
join ListasPrecios lp on lp.Id = dlp.ListaPreciosId
where lp.Id in ('4'))
select CodArticulo,CodArtProveedor,SUM(Publico),Sum(Interior) from cte group by CodArticulo,CodArtProveedor
这是您对#Temp
SELECT cast(A.CodigoArticulo as varchar) CodArticulo
, cast(ap.Codigo as varchar ) CodArtProveedor
, dlp.Precio Publico
, 0 Interior
INTO #TEMP
from Articulos a
join ArticuloProveedores ap on ap.ArticuloId = a.Id
join DetallesListaPrecios DLP on DLP.ArticuloId = A.Id
join ListasPrecios lp on lp.Id = dlp.ListaPreciosId
where lp.Id in ('1')
union all
SELECT cast(A.CodigoArticulo as varchar) CodArticulo
, cast(ap.Codigo as varchar ) CodArtProveedor
, 0
, dlp.Precio
FROM Articulos a
join ArticuloProveedores ap on ap.ArticuloId = a.Id
join DetallesListaPrecios DLP on DLP.ArticuloId = A.Id
join ListasPrecios lp on lp.Id = dlp.ListaPreciosId
where lp.Id in ('4')
这是你必须补充的,仅此而已
select sum(Publico),sum(Interior), CodArticulo, CodArtProveedor
from #TEMP
group by CodArticulo, CodArtProveedor
这是您对#Temp
SELECT cast(A.CodigoArticulo as varchar) CodArticulo
, cast(ap.Codigo as varchar ) CodArtProveedor
, dlp.Precio Publico
, 0 Interior
INTO #TEMP
from Articulos a
join ArticuloProveedores ap on ap.ArticuloId = a.Id
join DetallesListaPrecios DLP on DLP.ArticuloId = A.Id
join ListasPrecios lp on lp.Id = dlp.ListaPreciosId
where lp.Id in ('1')
union all
SELECT cast(A.CodigoArticulo as varchar) CodArticulo
, cast(ap.Codigo as varchar ) CodArtProveedor
, 0
, dlp.Precio
FROM Articulos a
join ArticuloProveedores ap on ap.ArticuloId = a.Id
join DetallesListaPrecios DLP on DLP.ArticuloId = A.Id
join ListasPrecios lp on lp.Id = dlp.ListaPreciosId
where lp.Id in ('4')
这是你必须补充的,仅此而已
select sum(Publico),sum(Interior), CodArticulo, CodArtProveedor
from #TEMP
group by CodArticulo, CodArtProveedor