首页 > 解决方案 > 从带有附加条件的不相关表中插入 INTO

问题描述

我现在正在学习SQL Server,我必须做一个项目,但是我有一个我无法解决的问题。我有三个不相关的表。这些是:

昏暗状态

id, stateName
1,Alabama
2,Alaska
3,Arizona
...

DimTime(在这些日期发生的事件,我稍后会分析)

id, fullDate, Year
1,2016-02-11, 2016
2,2016-04-21, 2016
3,2017-01-02, 2017
4,2017-01-03, 2017
...

人口

state, 2016,2017,2018
Alabama, 559330, 567020, 572001
Alaska, 347192, 351932, 349889
Arizona, 452779, 454559, 455419

我为结果创建了第四个表

昏暗状态人口

id, StateID, Year, Population

现在我的问题是:如何将值从以前的表中插入到第四个表中?我需要每年每个州的人口以及该州的 ID 和日期。结果应如下所示:

昏暗状态人口

id, StateID, Year, Population
1, 1,1, 559330
2, 1,2, 567020
3, 2,1, 347192
4, 2,2, 351932

当然,解决方案可以不同,我只需要能够分析人口变化

标签: sqlsql-server

解决方案


您可以通过几种方式实现这一点,但这里有一个简单的解决方案:

我根据您的数据创建了三个表:

昏暗状态

Id  StateName
1   Alabama
2   Alaska
3   Arizona

昏暗时间

Id  FullDate    Year
1   2016-02-11  2016
2   2016-04-21  2016
3   2017-01-02  2017
4   2017-01-03  2017

人口

State   2016    2017    2018
Alabama 10      20      30
Alaska  15      30      45
Arizona 20      40      60

使用以下代码删除您的枢轴:

WITH _Population AS (
SELECT [State], [Year], [Population]
FROM [Population]
UNPIVOT 
    ([Population] FOR [Year] IN 
        ([2016], [2017], [2018])
    ) AS UNPVT
)

此后,您可以使用您提到的关系连接所有相关表,尽管您的 Population 表上没有主键/外键。

-- INSERT INTO EXISTING_TABLE
SELECT DT.Id, StateName, FullDate, DT.[Year], [Population]
-- INTO #NEW_TABLE
FROM DimState DS 
INNER JOIN DimTime DT ON DT.Id = DS.Id
INNER JOIN _Population P ON P.State = DS.StateName

我已经评论了关于如何插入现有表或在插入数据时创建新表的注释。

您的整个解决方案如下所示:

WITH _Population AS (
SELECT [State], [Year], [Population]
FROM [Population]
UNPIVOT 
    ([Population] FOR [Year] IN 
        ([2016], [2017], [2018])
    ) AS UNPVT
)

-- INSERT INTO EXISTING_TABLE
SELECT DT.Id, StateName, FullDate, DT.[Year], [Population]
-- INTO #NEW_TABLE
FROM DimState DS 
INNER JOIN DimTime DT ON DT.Id = DS.Id
INNER JOIN _Population P ON P.State = DS.StateName

推荐阅读