我知道如何在sql中减去但在我的情况下它有点困难。
我有以下数据库
表1
id........artnumber.......price.......flag.......cid
1 12345001 1200 L 9999
2 12345002 2000 L 9999
3 12345003 500 L 7777
4 12345004 1950 L 6666
5 54321001 500 R 9999
6 54321002 1000 R 6666
7 54321003 500 R 9999
表2
id........artnumber.......comment
1 54321001 12345001
2 54321002 12345004
3 54321003 12345001
我在尝试的是: 我想从table1中选择所有具有 L 标志的声明 在这个结果我想用 L 标志从 L 标志中减去价格。但仅限于在表2的评论中有自己的艺术作品的人
我想要的结果是
artnumber.......price.......flag.......cid
12345001 200 L 9999 //her was 2 R flagged items substracted
12345002 2000 L 9999 //her was nothing substracted
12345003 500 L 7777 //her was nothing substracted
12345004 950 L 6666 //her was 1 R flagged item substracted
有人知道如何为此设置sqlstatement吗?
我在另一个帖子上找到了一些,但它并没有真正帮助我:)。
答案 0 :(得分:1)
这是L价格的数据:
select l.artnumber, l.price, l.flag
from table1 l
where l.flag = 'L';
这是您的R价格数据:
select x.comment as artnumber, sum(r.price)
from table1 r
inner join table2 x on x.artnumber = r.artnumber
where r.flag = 'R';
合:
select
l_data.artnumber,
l_data.price - (case when r_data.sum_price is null then 0 else r_data.sum_price end) as calc_price,
l_data.flag,
l_data.cid
from
(
select l.artnumber, l.price, l.flag, l.cid
from table1 l
where l.flag = 'L'
) l_data
left join
(
select x.comment as artnumber, sum(r.price)
from table1 r
inner join table2 x on x.artnumber = r.artnumber
where r.flag = 'R'
) r_data on r_data.artnumber = l_data.artnumber;
答案 1 :(得分:1)
这似乎有点时髦,但是这里有。我想这会让你得到你想要的东西:
SELECT a.artnumber, a.price - SUM(IFNULL(b.price, 0)) price, a.flag, a.cid
FROM Table1 a
LEFT JOIN (Table1 b INNER JOIN Table2 ON Table2.artnumber = b.artnumber AND b.flag = 'R')
ON Table2.comment = a.artnumber
WHERE a.flag = 'L'
GROUP BY a.artnumber, a.price, a.flag, a.cid
如果您需要我解释任何此类问题,请告诉我,但联接应该非常简单。
此外,根据您的类型,我不确定您是否必须CAST
该评论字段才能进行匹配。那里可能有一些考虑因素。我也在假设你的记录的独特性。换句话说,我假设artnumber
和flag
一起构成了一个独特的记录。