1

我需要加入两个表。第一个包含年份,第二个包含一些与年份相关的数据。如果name第二个表中的字段具有第一个表中的所有可能year值之一 - 此行应按原样添加。如果不是 -应该在所有其他字段中生成带有空值的name“新”行。yearIDK如何更具体。

tl;博士。例子:

SELECT years.year,
       name,
       salary
FROM
  (SELECT generate_series(2017, 2021) AS YEAR) AS years 
LEFT JOIN
  (SELECT 'Mary' AS name,
          1000 AS salary,
          2017 AS YEAR
   UNION ALL SELECT 'Mary' AS name,
                    1100 AS salary,
                    2018 AS YEAR
   UNION ALL SELECT 'John' AS name,
                    2000 AS salary,
                    2017 AS YEAR
   UNION ALL SELECT 'Kate' AS name,
                    5000 AS salary,
                    2019 AS YEAR) AS dummy_table ON years.year = dummy_table.year;

结果是

 year | name | salary 
------+------+--------
 2017 | John |   2000
 2017 | Mary |   1000
 2018 | Mary |   1100
 2019 | Kate |   5000
 2020 |      |       
 2021 |      |  

我需要的:

 year | name | salary 
------+------+--------
 2017 | John |   2000
 2017 | Mary |   1000
 2017 | Kate |   0
 2018 | Mary |   1100
 2018 | John |   0
 2018 | Kate |   0
 2019 | Mary |   0
 2019 | John |   0
 2019 | Kate |   5000
...(same zeroes for 2020 and 2021)
4

1 回答 1

1

使用 across join生成行,然后使用 a left join

SELECT years.year, n.name, coalesce(dummy_table.salary, 0)
FROM (SELECT generate_series(2017, 2021) AS YEAR) years CROSS JOIN
     (VALUES ('John'), ('Mary'), ('Kate')
     ) n(name) LEFT JOIN
     ( . . . 
     )
     dummy_table
     ON years.year = dummy_table.year AND n.name = dummy_table.name
ORDER BY years.year, v.name;

注意:您不必在dummy_table. 您可以使用:

(select distinct name from dummy_table) n

如果你有一张真实的桌子或 CTE,这会更好。

于 2021-02-02T15:44:55.903 回答