我在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=2
和date=01/01/2016
的金额总和以及itype=3
和date=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
我的结果与单独运行它们的结果不一样。请帮忙!
答案 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
。这些条件会过滤掉所有行。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()的大小,或者它可能会反击一天。