【问题标题】:SQL Table Sorting after/before using PIVOT使用 PIVOT 之后/之前的 SQL 表排序
【发布时间】:2020-08-24 02:44:04
【问题描述】:

我有一张这样的桌子:

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 个表格:

  • 从#ResultTable 中选择 *
  • 从#final中选择*
  • 执行(@query)

我的目标是使用每行的 TotalSN 计数对最终表进行排序。 例如。每行的 TotalSNs 下方:

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

我花了一天时间试图弄清楚,但我失败了。有解决办法吗?

【问题讨论】:

  • 在您的动态 SQL 中,只需添加 ORDER BY。例如... )AS pvt 按标题排序

标签: sql sql-server select pivot sql-order-by


【解决方案1】:

您可以通过在您的临时表#final 中记录Header 的出现来做到这一点。

尝试以下方法:

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)

请找到 dbfiddle here

【讨论】:

  • 谢谢,这正是我所需要的。现在我可以实现自己的订单要求了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-27
  • 2021-01-28
相关资源
最近更新 更多