根据同一表中的不同标准对2列进行求和

时间:2016-03-02 02:25:00

标签: sql-server

我在SQL Server 2012上,并且有一个类似于下面的表:

Trans

Amount   Itype     hPlant     PostDate
22.45     2         dplf      01/01/2016
45.55     2         dplf      01/01/2016
965.32    4         dplf      02/01/2016
14.25     3         dplf      01/01/2016
72.36     3         esch      01/01/2016
114147.77 2         dplf      01/01/2016
9641.25   4         dplf      01/01/2016
300.00    2         dplf      02/01/2016

我需要选择itype=2date=01/01/2016的金额总和以及itype=3date=01/01/2016以及plant=dplf加上其他一些金额的总和来自其他各种表格的数据。

如何从一个表中选择2个不同条件的总和。我有类似的东西:

SELECT 
    SUM(tr.amount), SUM(tr2.amount),
    CONVERT(VARCHAR, tr.date, 1) + ' ' + 'TB  Upload' Reference,
    p.scode 
FROM 
    trans tr 
INNER JOIN 
    plant p on p.hmy = tr.hplant
INNER JOIN  
    trans tr2 on tr2.hplant = tr.hplant 
WHERE 
    tr.date = '01/01/2016' 
    AND tr.itype = 2 
    AND tr2.itype = 3 
    AND tr2.date = '01/01/2016'
GROUP BY  
    tr.date, p.scode

我的结果与单独运行它们的结果不一样。请帮忙!

2 个答案:

答案 0 :(得分:0)

我认为您在查询中需要一些or

SELECT SUM(tr.amount), SUM(tr2.amount),
       CONVERT(VARCHAR(255), tr.date, 1)+' ' +'TB  Upload' AS Reference, p.scode
FROM trans tr INNER JOIN
     plant p
     on p.hmy = tr.hplant INNER JOIN 
     trans tr2
     ON tr2.hplant = tr.hplant
WHERE (tr.date = '2016-01-01' AND tr.itype = 2) OR
      (tr2.itype = 3 AND tr2.date = '2016-01-01')
GROUP BY tr.date, p.scode;

一些注意事项:

  • or子句中需要where。这些条件会过滤掉所有行。
  • 对日期使用ISO标准格式,例如YYYY-MM-DD
  • 在SQL Server中,永远不要使用varchar()而不使用长度。虽然它适用于您的情况,但默认长度因上下文而异,可能还不够。
  • 使用as列别名

答案 1 :(得分:0)

您根据不同条件查询同一个表sum()。因此,您不需要对同一个表进行自联接。使用CASE WHEN . .区分条件和SUM()

select sum(case when tr.itype = 2 then tr.amount else 0 end) as amount2,
       sum(case when tr.itype = 3 then tr.amount else 0 end) as amount3,
       convert(varchar(10), tr.date, 1) + ' ' + 'TB  Upload' Reference,
       p.scode 
from   trans tr 
       inner join plant p   on p.hmy = tr.hplant
where  tr.date = '20160101' 
and    tr.itype in ( 2 , 3 )
group by tr.date, p.scode

另外,总是指定varchar()的大小,或者它可能会反击一天。