如何创建 table,其中第一个 table 中的列是另一个 table 中的字段?

How to create table where columns in first table are fields in another table?

TABLE_1

  t1_id  name
 -------------
  1      mark
  2     stieve

TABLE_2

t2_id   month  amt   t1_id
----------------------------
 1      jan    200     1
 2      feb    400     1
 3      jan    500     2

预期输出

VIEW_TABLE_3

 T1_ID   name    jan    feb
 -----------------------
   1      mark   200   400
   2     stieve  500    0

在 VIEW_TABLE_3 中,我们需要创建列 Jan 和 Feb,它们是 Table_2 中的字段,以及它们各自的金额。

请帮忙如何得到这个输出?

我不知道您使用的是哪一个 RDBMS,但是在 SQL-Server 中您可以使用 PIVOT 如下:

CREATE TABLE #t1
(
    t1_id INT,
    name NVARCHAR(60)
)
CREATE TABLE #t2
(
    t2_id INT,
    [month] NVARCHAR(20),
    amt INT,
    t1_id INT
)
INSERT INTO #t1 VALUES (1, 'Mark'), (2, 'Stieve')
INSERT INTO #t2 VALUES 
(1,      'jan',    200,         1),
(2,      'feb',    400,         1),
(3,      'jan',    500,         2)

SELECT t1_id, Name, COALESCE(jan, 0) jan, COALESCE(feb, 0) feb
FROM (
    SELECT #t1.t1_id, #t1.Name, #t2.[month], #t2.amt
    FROM #t1
    JOIN #t2 ON #t1.t1_id = #t2.t1_id
)x
PIVOT
(
MAX([amt])
FOR [month] IN ([jan], [feb])
)piv

DROP TABLE #t1
DROP TABLE #t2

输出:

t1_id   Name    jan     feb
  1     Mark    200     400
  2    Stieve   500      0

在 PostgreSQL 中,您可以安装 tablefunc 扩展:

CREATE EXTENSION tablefunc;

在该扩展中,您会找到 crosstab(text, text) function。这是一个丑陋的函数(委婉地说),但它会做你想做的事:

SELECT * FROM crosstab(
    'SELECT t1_id, name, month, coalesce(amount, 0) FROM table_1 JOIN table_2 USING (t1_id)',
    'VALUES (''jan''), (''feb''), (''mar''), (''apr''), (''may''), (''jun''), (''jul''), (''aug''), (''sep''), (''oct''), (''nov''), (''dec'')'
  ) AS (
    id int, name varchar,
    jan int, feb int, mar int, apr int, may int, jun int,
    jul int, aug int, sep int, oct int, nov int, dec int
);

第一个参数指定要交叉制表的数据,以特定格式(查看文档),第二个参数指定类别。我在这里假设月份可以是一年中的任何一年。

如果同一个人在一个月内可以有多个记录,那么可以在第一个参数中求和coalesce(amount, 0),并添加一个GROUP BY 1, 2, 3子句。

最后,您可以将其包装在一个视图中:

CREATE VIEW view_table_3 AS
  SELECT * FROM crosstab(...