Sql 如何创建第一个表中的列是另一个表中的字段的表?
表1 表2Sql 如何创建第一个表中的列是另一个表中的字段的表?,sql,postgresql,pivot,crosstab,Sql,Postgresql,Pivot,Crosstab,表1 表2 t1_id name ------------- 1 mark 2 stieve 预期产出 查看表3 t2_id month amt t1_id ---------------------------- 1 jan 200 1 2 feb 400 1 3 jan 500 2 在视图_表_3中,我们需要创建列Jan和Feb,这是表_2中的字段,以及它们各自的金额
t1_id name
-------------
1 mark
2 stieve
预期产出
查看表3
t2_id month amt t1_id
----------------------------
1 jan 200 1
2 feb 400 1
3 jan 500 2
在视图_表_3中,我们需要创建列Jan和Feb,这是表_2中的字段,以及它们各自的金额
请帮助了解如何获得此输出?我不知道您使用的是哪种RDBMS,但在SQL Server中,您可以在以下方面使用
PIVOT
:
T1_ID name jan feb
-----------------------
1 mark 200 400
2 stieve 500 0
输出:
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
在PostgreSQL中,您可以安装
tablefunc
扩展:
t1_id Name jan feb
1 Mark 200 400
2 Stieve 500 0
在该扩展中,您将发现。这是一个很难使用的函数(委婉地说),但它可以实现您想要的功能:
CREATE EXTENSION tablefunc;
第一个参数指定以特定格式交叉制表的数据(查看文档),第二个参数指定类别。我在这里假设月份可能是一年中的任何一个月份
如果您可以在一个月内为同一个人创建多个记录,那么您可以在第一个参数中求和合并(金额,0)
,并添加GROUP BY 1、2、3
子句
最后,您可以将其包装到视图中:
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
);
既然问题使用了标签
mysql
和postgresql
,为什么要想出sqlserver
解决方案呢?我使用的是postgresql
CREATE VIEW view_table_3 AS
SELECT * FROM crosstab(...