MySQL - 减去表的某些行并将结果与​​其他行一起显示

发布于 2024-10-08 04:46:13 字数 2367 浏览 0 评论 0原文

我几个小时以来一直在努力解决这个查询。我有大量数据,我想只显示 ID 为 10、15、18 和 25 的部门。从这里,我想从 15 中减去 ID 为 18 的每个部门的利润,即 15-18。

我使用以下查询过滤数据:

SELECT * FROM deptTable WHERE ID IN(10,15,18,25) AND date = '2009-01-25'

dept ---------- date ---------------- ID ----------------- 利润
英国 ---------- 2009-01-25 ---------- 10 ---------------- 2000
巴西 ------- 2009-01-25 ---------- 10 ---------------- 1300
日本-------- 2009-01-25 --------- 10 ---------------- 2500
西班牙-------- 2009-01-25 ---------- 10 ---------------- 3200
英国 ---------- 2009-01-25 ---------- 15 ---------------- 4000
巴西 ------- 2009-01-25 ---------- 15 ---------------- 1700
日本-------- 2009-01-25 ---------- 15 ---------------- 3500
西班牙-------- 2009-01-25 ---------- 15 --------------- 1200
英国 ---------- 2009-01-25 ---------- 18 ---------------- 2500
巴西 ------- 2009-01-25 ---------- 18 ---------------- 1300
日本-------- 2009-01-25 --------- 18 ---------------- 2120
西班牙------- 2009-01-25 ---------- 18 ---------------- 800

英国 ---------- 2009-01-25 ---------- 25 ---------------- 3000
巴西 ------- 2009-01-25 ---------- 25 ---------------- 1850
日本-------- 2009-01-25 --------- 25 ---------------- 1580
西班牙-------- 2009-01-25 ---------- 25 ------------------ 1070

我基本上想要的是然后减去每个ID 18 的行来自 ID 15 的行。以英国为例:

4000 - 2500 = 1500,执行其余的 dept 区域将得到所需的结果:

dept -------- -- 日期 ---------------- ID ----------------- 利润
英国 ---------- 2009-01-25 ---------- 10 ---------------- 2000
巴西 ------- 2009-01-25 ---------- 10 ---------------- 1300
日本-------- 2009-01-25 --------- 10 ----------------- 2500
西班牙-------- 2009-01-25 ---------- 10 ---------------- 3200
英国 ---------- 2009-01-25 ---------- 15-18 ------------ 1500
巴西 ---------- 2009-01-25 ---------- 15-18 ------------ 400
日本-------- 2009-01-25 ---------- 15-18 ----------- 1380
西班牙-------- 2009-01-25 ---------- 15-18 ----------- 400

英国 ---------- 2009-01-25 ---------- 25 ---------------- 3000
巴西 ------- 2009-01-25 ---------- 25 ---------------- 1850
日本-------- 2009-01-25 ---------- 25 ---------------- 1580
西班牙-------- 2009-01-25 ---------- 25 ------------------ 1070

2 分:
1.计算出的行ID列不必读取“15-18”,我只是输入“15-18”来帮助解释问题
2.斜体/粗体是唯一计算的行,所有其他行保持不变这样

的事情肯定是可能的吗?

谢谢,

I have been struggling with getting this query right for hours now. I have a huge amount of data and I want to show just the departments with IDs 10,15,18 and 25. From here, I want to subtract the profits for each dept with ID 18 from 15, i.e. 15-18.

I filter the data with the following query:

SELECT * FROM deptTable WHERE ID IN(10,15,18,25) AND date = '2009-01-25'

dept ---------- date ---------------- ID ----------------- profit
UK ---------- 2009-01-25 ---------- 10 ---------------- 2000
Brazil ------- 2009-01-25 ---------- 10 ---------------- 1300
Japan------- 2009-01-25 --------- 10 ---------------- 2500
Spain------- 2009-01-25 ---------- 10 ---------------- 3200
UK ---------- 2009-01-25 ---------- 15 ---------------- 4000
Brazil ------- 2009-01-25 ---------- 15 ---------------- 1700
Japan------- 2009-01-25 ---------- 15 ---------------- 3500
Spain-------- 2009-01-25 ---------- 15 --------------- 1200
UK ---------- 2009-01-25 ---------- 18 ---------------- 2500
Brazil ------- 2009-01-25 ---------- 18 ---------------- 1300
Japan------- 2009-01-25 --------- 18 ---------------- 2120
Spain------- 2009-01-25 ---------- 18 ---------------- 800

UK ---------- 2009-01-25 ---------- 25 ---------------- 3000
Brazil ------- 2009-01-25 ---------- 25 ---------------- 1850
Japan------- 2009-01-25 --------- 25 ---------------- 1580
Spain-------- 2009-01-25 ---------- 25 --------------- 1070

What I basically want is to then subtract each row with ID 18 from rows with ID 15. Taking the UK as an example:

4000 - 2500 = 1500, doing the rest of the dept regions will give the desired result which is:

dept ---------- date ---------------- ID ----------------- profit
UK ---------- 2009-01-25 ---------- 10 ---------------- 2000
Brazil ------- 2009-01-25 ---------- 10 ---------------- 1300
Japan------- 2009-01-25 --------- 10 ----------------- 2500
Spain------- 2009-01-25 ---------- 10 ---------------- 3200
UK ---------- 2009-01-25 ---------- 15-18 ------------ 1500
Brazil ------- 2009-01-25 ---------- 15-18 ------------ 400
Japan------- 2009-01-25 ---------- 15-18 ----------- 1380
Spain-------- 2009-01-25 ---------- 15-18 ----------- 400

UK ---------- 2009-01-25 ---------- 25 ---------------- 3000
Brazil ------- 2009-01-25 ---------- 25 ---------------- 1850
Japan------- 2009-01-25 ---------- 25 ---------------- 1580
Spain-------- 2009-01-25 ---------- 25 --------------- 1070

2 points:
1. The calculated rows ID column doesn't have to read '15-18', I've just typed '15-18' to help explain the issue
2. The italics/bold are the only calculated rows, all other rows remain the same

Surely something like this is possible?

Thanks,

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

去了角落 2024-10-15 04:46:13

我认为这样的事情会起作用......

SELECT a.dept, a.date, IF(a.id=15,'15-18',a.id) AS id, IF(b.profit IS NULL,a.profit,a.profit-b.profit) AS profit
FROM deptTable a 
LEFT JOIN deptTable b ON a.ID=15 AND b.ID=18 AND a.dept=b.dept
WHERE a.ID IN(10,15,25) AND a.date = '2009-01-25' 

测试结果:

+--------+------------+-------+--------+
| dept   | date       | id    | profit |
+--------+------------+-------+--------+
| UK     | 2009-01-25 | 10    |   2000 |
| Brazil | 2009-01-25 | 10    |   1300 |
| JAPAN  | 2009-01-25 | 10    |   2500 |
| SPAIN  | 2009-01-25 | 10    |   3200 |
| UK     | 2009-01-25 | 15-18 |   1500 |
| Brazil | 2009-01-25 | 15-18 |    400 |
| JAPAN  | 2009-01-25 | 15-18 |   1380 |
| SPAIN  | 2009-01-25 | 15-18 |    400 |
| UK     | 2009-01-25 | 25    |   3000 |
| Brazil | 2009-01-25 | 25    |   1850 |
| JAPAN  | 2009-01-25 | 25    |   1580 |
| SPAIN  | 2009-01-25 | 25    |   1070 |
+--------+------------+-------+--------+

I think that something like this will work...

SELECT a.dept, a.date, IF(a.id=15,'15-18',a.id) AS id, IF(b.profit IS NULL,a.profit,a.profit-b.profit) AS profit
FROM deptTable a 
LEFT JOIN deptTable b ON a.ID=15 AND b.ID=18 AND a.dept=b.dept
WHERE a.ID IN(10,15,25) AND a.date = '2009-01-25' 

Tested result:

+--------+------------+-------+--------+
| dept   | date       | id    | profit |
+--------+------------+-------+--------+
| UK     | 2009-01-25 | 10    |   2000 |
| Brazil | 2009-01-25 | 10    |   1300 |
| JAPAN  | 2009-01-25 | 10    |   2500 |
| SPAIN  | 2009-01-25 | 10    |   3200 |
| UK     | 2009-01-25 | 15-18 |   1500 |
| Brazil | 2009-01-25 | 15-18 |    400 |
| JAPAN  | 2009-01-25 | 15-18 |   1380 |
| SPAIN  | 2009-01-25 | 15-18 |    400 |
| UK     | 2009-01-25 | 25    |   3000 |
| Brazil | 2009-01-25 | 25    |   1850 |
| JAPAN  | 2009-01-25 | 25    |   1580 |
| SPAIN  | 2009-01-25 | 25    |   1070 |
+--------+------------+-------+--------+
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文