Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将结果求和为一个并集_Sql_Sql Server - Fatal编程技术网

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

我在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 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