SQL Сервер типичной транспонирования - PullRequest
0 голосов
/ 01 апреля 2020
CREATE TABLE [dbo].[Test]
(
    [ID] [int] NOT NULL,
    [SchedId] [int] NOT NULL,
    [ActivityCoded] [int] NULL,
    [RegnNo] [int] NULL,
    [Region] [varchar](50) NULL,
    [TrDate] [datetime] NULL,
    [Morning] [int] NULL,
    [Evening] [int] NULL,
    [Night] [int] NULL,

    CONSTRAINT [PK_Test] 
        PRIMARY KEY CLUSTERED ([ID] ASC)
                    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                          IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
                          ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

SET ANSI_PADDING OFF
GO

INSERT INTO [dbo].[Test] ([ID], [SchedId], [ActivityCoded], [RegnNo], [Region], [TrDate], [Morning], [Evening], [Night]) 
VALUES (1, 2505, 1, 500, N'DRYDEN', CAST(N'2019-11-20 00:00:00.000' AS DateTime), 4, 5, 20)

INSERT INTO [dbo].[Test] ([ID], [SchedId], [ActivityCoded], [RegnNo], [Region], [TrDate], [Morning], [Evening], [Night]) 
VALUES (2, 2505, 1, 500, N'DRYDEN', CAST(N'2019-11-21 00:00:00.000' AS DateTime), 15, 2, 2)

INSERT INTO [dbo].[Test] ([ID], [SchedId], [ActivityCoded], [RegnNo], [Region], [TrDate], [Morning], [Evening], [Night]) 
VALUES (3, 2505, 1, 500, N'DRYDEN', CAST(N'2019-11-22 00:00:00.000' AS DateTime), 14, 34, 34)

INSERT INTO [dbo].[Test] ([ID], [SchedId], [ActivityCoded], [RegnNo], [Region], [TrDate], [Morning], [Evening], [Night]) 
VALUES (4, 2505, 1, 500, N'DRYDEN', CAST(N'2019-11-23 00:00:00.000' AS DateTime), 45, 5, 54)

INSERT INTO [dbo].[Test] ([ID], [SchedId], [ActivityCoded], [RegnNo], [Region], [TrDate], [Morning], [Evening], [Night]) 
VALUES (5, 2505, 1, 500, N'DRYDEN', CAST(N'2019-11-24 00:00:00.000' AS DateTime), 34, 23, 34)

INSERT INTO [dbo].[Test] ([ID], [SchedId], [ActivityCoded], [RegnNo], [Region], [TrDate], [Morning], [Evening], [Night]) 
VALUES (6, 2505, 2, 500, N'RIO', CAST(N'2019-11-21 00:00:00.000' AS DateTime), 1, 7, 0)

INSERT INTO [dbo].[Test] ([ID], [SchedId], [ActivityCoded], [RegnNo], [Region], [TrDate], [Morning], [Evening], [Night]) 
VALUES (7, 2505, 2, 500, N'RIO', CAST(N'2019-11-22 00:00:00.000' AS DateTime), 2, 8, 9)

INSERT INTO [dbo].[Test] ([ID], [SchedId], [ActivityCoded], [RegnNo], [Region], [TrDate], [Morning], [Evening], [Night]) 
VALUES (8, 2505, 2, 500, N'RIO', CAST(N'2019-11-23 00:00:00.000' AS DateTime), 3, 5, 6)

INSERT INTO [dbo].[Test] ([ID], [SchedId], [ActivityCoded], [RegnNo], [Region], [TrDate], [Morning], [Evening], [Night]) 
VALUES (9, 2505, 2, 500, N'RIO', CAST(N'2019-11-24 00:00:00.000' AS DateTime), 4, 4, 5)

INSERT INTO [dbo].[Test] ([ID], [SchedId], [ActivityCoded], [RegnNo], [Region], [TrDate], [Morning], [Evening], [Night]) 
VALUES (10, 2505, 2, 500, N'RIO', CAST(N'2019-11-25 00:00:00.000' AS DateTime), 5, 7, 4)

Мое требование - мне нужно одновременно преобразовать TrDate в столбцы Утренний, Вечерний, Ночной столбцы в строки типа

+---------------+---------+--------+--------+----------+------------+------------+------------+------------+------------+
| ActivityCoded | SchedId | RegnNo | Region | Session  | 11/20/2019 | 11/21/2019 | 11/22/2019 | 11/23/2019 | 11/24/2019 |
+---------------+---------+--------+--------+----------+------------+------------+------------+------------+------------+
|             1 |    2505 |    500 | Dryden | Morning  |          4 |         15 |         14 |         45 |         34 |
|             1 |    2505 |    500 | Dryden | Evening  |          5 |          2 |         34 |          5 |         23 |
|             1 |    2505 |    500 | Dryden | Night    |         20 |          2 |         34 |         54 |         34 |
|             2 |    2505 |    500 | RIO    | Morning  |          1 |          2 |          3 |          4 |          5 |
|             2 |    2505 |    500 | RIO    | Evening  |          7 |          8 |          5 |          4 |          7 |
|             2 |    2505 |    500 | RIO    | Night    |          0 |          9 |          6 |          5 |          4 |
+---------------+---------+--------+--------+----------+------------+------------+------------+------------+------------+

Я пробовал Cross Apply, Pivot, но я не могу получить желаемый результат

1 Ответ

0 голосов
/ 01 апреля 2020
select *
from
(
    --unpivot, morning/evening/night into rows
    select ActivityCoded, SchedId, RegnNo, Region, convert(varchar(12), TrDate, 101) as TrDateUS, Session, SessionValue
    from dbo.Test as t
    unpivot
    (
    SessionValue for Session in (Morning, Evening, Night)
    ) as unpv
) as src
--pivot for days
pivot
(
max(SessionValue) for TrDateUS in ([11/20/2019], [11/21/2019], [11/22/2019], [11/23/2019], [11/24/2019] /*...*/)
) as p;


declare @sql nvarchar(max) = isnull(
stuff
((select ','+quotename(convert(varchar(12), d.TrDate, 101))
from (select distinct TrDate from dbo.Test) as d
order by d.TrDate
for xml path('')), 1,1,N''), quotename(convert(varchar(12), getdate(), 101)));

select @sql = N'select *
from
(
    --unpivot, morning/evening/night into rows
    select ActivityCoded, SchedId, RegnNo, Region, convert(varchar(12), TrDate, 101) as TrDateUS, Session, SessionValue
    from dbo.Test as t
    unpivot
    (
    SessionValue for Session in (Morning, Evening, Night)
    ) as unpv
) as src
--pivot for days
pivot
(
max(SessionValue) for TrDateUS in (' + @sql + ')
) as p;
';
exec(@sql);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...