SQL Сервер PIVOT справка по датам - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть таблица с данными Dynami c. Общий пример

A               B                    C
04/05/2020     04/05/2020 9:00     04/05/2020 13:00
04/05/2020     04/05/2020 13:30     04/05/2020 17:05

Мне нужно, чтобы данные были в одной строке, например

A               B                    C                   D                 E
04/05/2020     04/05/2020 9:00     04/05/2020 13:00  04/05/2020 13:30    04/05/2020 17:05

Я пытался использовать PIVOT, но это не помогло мне с предложением?

Ответы [ 2 ]

2 голосов
/ 06 апреля 2020

В основном, что сказал Мар c. Вот пример того, как это должно выглядеть. Хотя часть, которая описана в Marcs Link, состоит в том, как сделать эту динамическую c так же, как для функции PIVOT, значения должны быть определены изначально и не могут быть динамическими c:

CREATE TABLE dbo.Test(
  A VARCHAR(10),
  B VARCHAR(10),
  C VARCHAR(10)
)

INSERT INTO [dbo].[Test]
       ( [A]
        ,[B]
        ,[C]
       )
VALUES
(
  'A' -- A - VARCHAR
 ,'B' -- B - VARCHAR
 ,'C' -- C - VARCHAR
),
(
  'A' -- A - VARCHAR
 ,'B' -- B - VARCHAR
 ,'C' -- C - VARCHAR
);


SELECT [1], [2], [3], [4], [5], [6], [7], [8], [9]
FROM (
   SELECT *, ROW_NUMBER() OVER (ORDER BY A) AS Id 
     FROM (
     SELECT A, 'Col' AS X FROM dbo.Test
     UNION ALL
     SELECT B, 'Col' AS X FROM dbo.Test
     UNION ALL
     SELECT C, 'Col' AS X FROM dbo.[Test] tes
     ) AS Q
    ) AS P
PIVOT (MAX(A) FOR Id IN ([1], [2], [3], [4], [5], [6], [7], [8], [9])) AS Pvt
0 голосов
/ 06 апреля 2020

Сначала вы должны получить все свои данные в одном наборе данных:

with data as (
  select A as value from MyTable
  union 
  select B from MyTable
  union 
  select C from MyTable
)
select value from data order by value

После нормализации данных вы можете использовать универсальное c решение для преобразования строк в столбцы.

Вот так: Эффективно преобразуйте строки в столбцы на sql сервере

Это будет выглядеть так:

-- Create the sample data

create table MyTable (A datetime, B datetime, C datetime)
insert into MyTable (A, B, C)
            values ('04/05/2020', '04/05/2020 9:00', '04/05/2020 13:00'),
                   ('04/05/2020', '04/05/2020 13:30', '04/05/2020 17:05')

-- Normalize the data
;
with data as (
  select A as value from MyTable
  union 
  select B from MyTable
  union 
  select C from MyTable
)
select value 
into #data       
from data 
order by value

-- Return rows as columns

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

select @cols = STUFF((SELECT ',' + QUOTENAME(value) 
                    from #data
                    order by value
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = N'SELECT ' + @cols + N' from 
             (
                select value
                from #data
            ) x
            pivot 
            (
                max(value)
                for value in (' + @cols + N')
            ) p '

exec sp_executesql @query;

drop table #data
...