首页新闻找找看学习计划

mysql左链接笛卡尔积如何避免?

0
悬赏园豆:5 [已解决问题] 解决于 2018-05-22 09:30

我有一张表如图

id projectName pId cDate amount period contractNum ownerName archives
1  江夏区大桥   1  2017 1900000 1     001     A     1
2  江夏区大桥   1  2017 1500000 2     001     A     1
3  江夏区大桥   1  2018 1900000 1     001     A     1
4  其他区大桥   2  2018 1900000 1     002     B     2
5  北方区大桥   3  2016 1902451 1     003     C     3
6  北方区大桥   3  2016 1854695 2     003     C     3
7  江夏区大桥   1  2016 1500000 1     001     A     1
8  江夏区大桥   1    2016 1000000 1     001     A     1

我想查出年份大于2016的所有记录,每条记录要加上这个项目在2016年前的所有的付款金额的总和,这个sql语句怎么写?我写了一个但是只出了一条数据并且是错误的。
SELECT DATE_FORMAT(t.cDate,'%Y') AS YEAR,t.*,SUM(a.amount) FROM wlkgltz1 t
LEFT JOIN 
(SELECT * FROM wlkgltz1 t WHERE DATE_FORMAT(t.cDate,'%Y')<='2016') a
ON 
t.pId = a.pId
WHERE DATE_FORMAT(t.cDate,'%Y') > '2016'

whitea的主页 whitea | 初学一级 | 园豆:72
提问于:2018-04-24 11:44
< >
分享
最佳答案
0

试一下这个
select w2., w4.sum2016
(select w1.
from wlkgltz1 w1 where DATE_FORMAT(w1.cDate,'%Y')>'2016) w2,
(select sum(amount) sum2016 from wlkgltz1 w3 where w3.projectName = w2.projectName and DATE_FORMAT(t.cDate,'%Y')<='2016' group by cDate) w4;

收获园豆:5
流年飞雨 | 小虾三级 |园豆:1978 | 2018-04-28 00:07
其他回答(3)
0

select sum(amount) from wlkgltz1 group by pid WHERE DATE_FORMAT(t.cDate,'%Y') < '2016'

小光 | 园豆:1830 (小虾三级) | 2018-04-24 16:51
0

group by pId 

西漠以西 | 园豆:1670 (小虾三级) | 2018-04-24 17:26
0

添加distinct(去重)

DanBrown | 园豆:1496 (小虾三级) | 2018-05-03 10:06
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册