SQL Сортировка таблиц после / до использования PIVOT - PullRequest
0 голосов
/ 08 мая 2020

у меня есть такая таблица:

Header  FPSNs   TotalSNs    StartTime
2082    6       6           2020-04-08 10:30:02.000
2085    6       6           2020-04-08 15:42:18.000
2088    0       3           2020-04-08 19:00:22.000
2234    1       4           2020-04-08 06:04:01.000
2081    4       4           2020-04-09 21:32:27.000
2082    5       7           2020-04-09 13:33:51.000
2085    3       6           2020-04-09 07:53:34.000
2088    1       4           2020-04-09 17:21:27.000
2082    6       6           2020-04-14 15:00:08.000
2223    7       8           2020-04-14 06:41:47.000
2082    10      12          2020-04-15 08:32:20.000
2085    5       5           2020-04-15 11:10:16.000
2234    3       4           2020-04-15 12:24:13.000
2260    4       5           2020-04-15 10:16:44.000

, которую я конвертирую в это:

Header  Result  startdate
2082    6/6     2020-04-08
2085    6/6     2020-04-08
2088    0/3     2020-04-08
2234    1/4     2020-04-08
2081    4/4     2020-04-09
2082    5/7     2020-04-09
2085    3/6     2020-04-09
2088    1/4     2020-04-09
2082    6/6     2020-04-14
2223    7/8     2020-04-14
2082    10/12   2020-04-15
2085    5/5     2020-04-15
2234    3/4     2020-04-15
2260    4/5     2020-04-15

, чтобы наконец достичь этого:

Header  2020-04-08  2020-04-09  2020-04-14  2020-04-15
2081    NULL        4/4         NULL        NULL
2082    6/6         5/7         6/6         10/12
2085    6/6         3/6         NULL        5/5
2088    0/3         1/4         NULL        NULL
2223    NULL        NULL        7/8         NULL
2234    1/4         NULL        NULL        3/4
2260    NULL        NULL        NULL        4/5

Вот код, как это делается:

CREATE TABLE #final (Header varchar(max), Result varchar(max), startdate date);

INSERT INTO #final
SELECT Header
      ,CONVERT(varchar(10),FPSNs) + '/' + CONVERT(varchar(10),TotalSNs) as Result
--    ,LEFT(DATENAME(WEEKDAY,StartTime),3) as 'Day'
      ,convert(date, StartTime) as Startdate
FROM #ResultTable

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

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

select * from #ResultTable
select * from #final

declare @query as nvarchar(max);
set @query = 'SELECT Header, '+@cols + 'FROM
(SELECT Startdate, header, Result from #final ) p
PIVOT
(MAX(Result) For Startdate in ( ' + +@cols + ')
)AS pvt'

execute(@query)

Эти операторы в коде представляют 3 таблицы выше:

  • select * from # ResultTable
  • select * from #final
  • execute (@query)

Моя цель - отсортировать итоговую таблицу, используя подсчет TotalSN для каждой строки. Например. ниже TotalSN для каждой строки:

2081    4
2082    31
2085    17
2088    7
2223    8
2234    8
2260    5

итак, таблица должна выглядеть так:

Header  2020-04-08  2020-04-09  2020-04-14  2020-04-15
2082    6/6         5/7         6/6         10/12
2085    6/6         3/6         NULL        5/5
2223    NULL        NULL        7/8         NULL
2234    1/4         NULL        NULL        3/4
2088    0/3         1/4         NULL        NULL
2260    NULL        NULL        NULL        4/5
2081    NULL        4/4         NULL        NULL

Я трачу день, пытаясь понять это, но мне это не удалось. Есть ли решение для этого?

1 Ответ

0 голосов
/ 09 мая 2020

Вы можете сделать это, сохраняя запись появления Header в вашей временной таблице #final.

попробуйте следующее:

INSERT INTO #final
SELECT t.Header
      ,CONVERT(varchar(10),FPSNs) + '/' + CONVERT(varchar(10),TotalSNs) as Result
--    ,LEFT(DATENAME(WEEKDAY,StartTime),3) as 'Day'
      ,convert(date, StartTime) as Startdate
      ,rc
FROM @t t
join
(
    select count(1) rc, Header from @t group by Header
)x on x.Header = t.Header

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

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

SET @query = 'SELECT Header, ' + @cols + 'FROM
    (
        SELECT Startdate, header, Result, rc from #final
    ) p
    PIVOT
    (
        MAX(Result) For Startdate in ( ' + +@cols + ')
    )AS pvt
    order by rc desc';
execute(@query)

Найдите db < > скрипка здесь .

...