首页 > 解决方案 > 表的动态列

问题描述

我有一张桌子销售:

SalesID. Date. Geography

1.       2020-01.  Italy
1.       2020-01.  France
1.       2020-01.  UK
2.       2020-02.  Italy
2.       2002-02.  Canada
3.       2002-08.  France

我想要这样的结果:

SalesID. Date. Geography1 Geography2.    Geography3
1.    2020-01.   Italy. France. Uk
2.  2020-02.  Italy.  Canada.  Null
3. 2020-08. France

我知道如何对列进行透视,但销售 ID 的地理数量是无限的。这个怎么做?

标签: sqlsql-serversql-server-2014

解决方案


CREATE TABLE MyTable(
SalesID INT,
[Date] varchar(20),
Geography VARCHAR(50)
);
INSERT INTO MyTable(SalesID,[Date],Geography)VALUES
(1,'2020-01','Italy'),(1,'2020-01','France'),
(1,'2020-01','UK'),(2,'2020-02','Italy'),(2,'2020-02','Canada'),
(3,'2020-08','France');


DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(a.Geography) 
            FROM MyTable a
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT date, ' + @cols + ' from 
            (
                select 
                    SalesID
                    ,Date
                    , Geography
                
                from MyTable
           ) x
            pivot 
            (
                 max(Geography)
                for Geography in (' + @cols + ')
            ) p '


execute(@query)
日期 | 加拿大 | 法国 | 意大利 | 英国  
:-------- | :----- | :----- | :---- | :---
2020-01 |    | 法国 | 意大利 | 英国  
2020-02 | 加拿大 |    | 意大利 | 
2020-08 |    | 法国 |   | 无效的

db<>在这里摆弄


推荐阅读