【问题标题】:I'm looking for a right solution to achieve the below scenario in SQL Server我正在寻找一个正确的解决方案来在 SQL Server 中实现以下场景
【发布时间】:2021-10-12 06:58:44
【问题描述】:

我有一个来自下面这样的查询的结果集

Court_id from to Available
7 6:00:00 7:00:00 Yes
7 7:00:00 8:00:00 No
7 8:00:00 9:00:00 Yes
8 6:00:00 7:00:00 Yes
8 7:00:00 8:00:00 Yes
8 8:00:00 9:00:00 No
9 6:00:00 7:00:00 Yes
9 7:00:00 8:00:00 Yes
9 8:00:00 9:00:00 No

如何从上面的结果中按列实现如下?

from to 7 8 9
6:00:00 7:00:00 Yes Yes Yes
7:00:00 8:00:00 no Yes Yes
8:00:00 9:00:00 Yes no no

Court_id 可以不时更改。

我尝试了以下方法

CREATE TABLE [testslots](   
    [Court_id] [int] NULL,
    [from]  [nvarchar](10) NULL,
    [to]  [nvarchar](10) NULL,
    [Available] [nvarchar](10) NULL);


INSERT INTO [testslots] ([Court_id] ,[from] ,[to] ,[Available])VALUES (7,'6AM','7AM','Yes');
INSERT INTO [testslots] ([Court_id] ,[from] ,[to] ,[Available])VALUES (7,'7AM','8AM','no');
INSERT INTO [testslots] ([Court_id] ,[from] ,[to] ,[Available])VALUES (7,'8AM','9AM','Yes');
INSERT INTO [testslots] ([Court_id] ,[from] ,[to] ,[Available])VALUES (8,'6AM','7AM','Yes');
INSERT INTO [testslots] ([Court_id] ,[from] ,[to] ,[Available])VALUES (8,'7AM','8AM','Yes');
INSERT INTO [testslots] ([Court_id] ,[from] ,[to] ,[Available])VALUES (8,'8AM','9AM','no');
INSERT INTO [testslots] ([Court_id] ,[from] ,[to] ,[Available])VALUES (9,'6AM','7AM','Yes');
INSERT INTO [testslots] ([Court_id] ,[from] ,[to] ,[Available])VALUES (9,'7AM','8AM','Yes');
INSERT INTO [testslots] ([Court_id] ,[from] ,[to] ,[Available])VALUES (9,'8AM','9AM','no');


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

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.Court_id) 
            FROM [testslots] c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT [from],[to], ' + @cols + ' from 
            (
                select [from]
                    , [to]
                    , [available]
                from testslots
           ) x
            pivot 
            (
                 max([available])
                for available in (' + @cols + ')
            ) p '

exec sp_executesql @query;

【问题讨论】:

    标签: sql sql-server database pivot


    【解决方案1】:

    您旋转了错误的列:

    DECLARE @cols nvarchar(max) = STUFF((
                SELECT distinct ',' + QUOTENAME(c.Court_id) 
                FROM [testslots] c
                FOR XML PATH(''), TYPE
                ).value('text()[1]', 'NVARCHAR(MAX)') 
            ,1,LEN(','),'');
    
    DECLARE @query nvarchar(max) = '
    SELECT
      [from],[to],
      ' + @cols + '
    from 
    (
        select [from]
             , [to]
             , Court_id
             , available
        from testslots
    ) x
    pivot 
    (
        max([available])
        for Court_id in (' + @cols + ')
    ) p;
    ';
    
    exec sp_executesql @query;
    

    【讨论】:

    • 完美运行!
    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 2016-08-13
    • 2017-08-11
    • 1970-01-01
    • 2020-08-07
    相关资源
    最近更新 更多