从一个组织为矩阵的表创建一个可搜索的表

时间:2017-11-29 12:55:28

标签: sql sql-server

我遇到下表sales

country    2017-Q4    2017-Q3    2017-Q2    ...    1985-Q1
----------------------------------------------------------
Germany      100        200        75                10
Senegal       20         50       130               NULL
Belgium      150         66        22                 5

我无法有效地查询,例如" 2017年至第三季度的德国销售"。

我想按照以下方式重新格式化此表:

country    quarter    sales
---------------------------
Germany    2017-Q4     100
Germany    2017-Q3     200
...
Belgium    1985-Q1       5

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

我会使用cross apply执行此操作:

select v.*
from t cross apply
     (values (t.country, '2017-Q4', [2017-Q4]),
             (t.country, '2017-Q3', [2017-Q3]),
             . . .
     ) v(country, quarter, sales);

您也可以使用unpivotunion all查询执行此操作。 apply语法实现横向连接,它们非常强大(并且还有许多其他用途)。我发现unpivot是非常定制的语法,可以做一件事(因此最好学习横向连接)。

union all效率较低,因为它多次读取表格。