Mysql SQL中两个表的输出

Mysql SQL中两个表的输出,mysql,sql,window-functions,lag,lead,Mysql,Sql,Window Functions,Lag,Lead,我正在学习SQL,遇到了下面提到的场景 Table 1 id Name City 1 Ryan Chennai 2 Tom Banglore 3 Sam Pune 4 Kat Mumbai Table 2 id month salary 1 prev 1000 1 cur 4000 1 next 3000 2 prev 1000 2 cur 3000 2 next 4000 3 prev 2000 3 cur 5000 3 nex

我正在学习SQL,遇到了下面提到的场景

Table 1
id  Name City
1   Ryan Chennai
2   Tom  Banglore
3   Sam  Pune
4   Kat  Mumbai

Table 2
id month salary
1  prev  1000
1  cur   4000
1  next  3000
2  prev  1000
2  cur   3000
2  next  4000
3  prev  2000
3  cur   5000
3  next  6000
4  prev  1500
4  cur   2500
4  next  3000
输出表应该如下所示

id  name city      cur  prev next
1   Ryan Chennai   4000 1000 3000
2
3
4
(其他ID也是如此。)


那么实现这一点的不同方法是什么呢?如果有人能帮助我理解如何解决这类问题,那将非常有帮助。

首先,我们创建数据

DROP TABLE IF EXISTS table_1;
DROP TABLE IF EXISTS table_2;

CREATE TABLE table_1 (
  id INT PRIMARY KEY,
  Name VARCHAR(10),
  City VARCHAR(10)
);

CREATE TABLE table_2 (
    id INT,
    month VARCHAR(10),
    salary INT);

INSERT INTO table_1
VALUES (1, 'Ryan', 'Chennai'),
       (2, 'Tom', 'Banglore'),
       (3, 'Sam', 'Pune'),
       (4, 'Kat', 'Mumbai');

INSERT INTO table_2
VALUES (1, 'prev', 1000),
       (1, 'cur', 4000),
       (1, 'next', 3000),
       (2, 'prev', 1000),
       (2, 'cur', 3000),
       (2, 'next', 4000),
       (3, 'prev', 2000),
       (3, 'cur', 5000),
       (3, 'next', 6000),
       (4, 'prev', 1500),
       (4, 'cur', 2500),
       (4, 'next', 3000);
为了获得所需的结果,我们将
id
列上的表和
sum
列上的表连接到
月份
列中,仅考虑所需的值

SELECT t1.name
     , t1.city
     , SUM(CASE WHEN t2.month = 'cur' THEN salary ELSE 0 END) AS 'cur'
     , SUM(CASE WHEN t2.month = 'prev' THEN salary ELSE 0 END) AS 'prev'
     , SUM(CASE WHEN t2.month = 'next' THEN salary ELSE 0 END) AS 'next'
  FROM table_1 AS t1
       INNER JOIN table_2 AS t2 
                  USING (id)
 GROUP BY t1.name, t1.city;
我们得到下表:

名称 城市 cur 上 下一个 赖安 钦奈 4000 1000 3000 汤姆 班加罗尔 3000 1000 4000 山姆 浦那 5000 2000 6000 凯特 孟买 2500 1500 3000
你真的不需要使用超前或滞后。这可以使用三个SUM(CASE…)语句和一个group by来完成。为什么只有一行是空的?非常感谢您的解决方案。