转换MSSQL列中的行

问题描述 投票:3回答:2

我有这张桌子

|ID | day_name   |        day_date     |
  1   Monday     2018-01-08 00:00:00.000
  2   Monday     2018-01-15 00:00:00.000
  3   Monday     2018-01-22 00:00:00.000
  4   Monday     2018-01-29 00:00:00.000
 10   Tuesday    2018-01-16 00:00:00.000
 11   Tuesday    2018-01-23 00:00:00.000
 12   Tuesday    2018-01-30 00:00:00.000

我想将行旋转到列,以便结果集如下:

|        Monday            |       Tuesday           |
2018-01-08 00:00:00.000     2018-01-16 00:00:00.000
2018-01-15 00:00:00.000     2018-01-23 00:00:00.000
2018-01-22 00:00:00.000     2018-01-30 00:00:00.000
2018-01-29 00:00:00.000

我尝试了一些操作,但结果与预期不符:

WITH dayz AS
(
    SELECT day_name, day_date,
    [rn] = RANK() OVER (PARTITION BY day_name ORDER BY day_date)
    FROM ISP_Cloud_DaysFromSession
)
SELECT 
    day_name,
     MondayDates = MAX(CASE WHEN rn = 1 THEN day_date ELSE NULL END),
  TuesdayyDates = MAX(CASE WHEN rn = 2 THEN day_date ELSE NULL END),
  Column3 = MAX(CASE WHEN rn = 3 THEN day_date ELSE NULL END),
  Column4 = MAX(CASE WHEN rn = 4 THEN day_date ELSE NULL END),
  Column5 = MAX(CASE WHEN rn = 5 THEN day_date ELSE NULL END),
  Column6 = MAX(CASE WHEN rn = 6 THEN day_date ELSE NULL END),
  Column7 = MAX(CASE WHEN rn = 7 THEN day_date ELSE NULL END),
  Column8 = MAX(CASE WHEN rn = 8 THEN day_date ELSE NULL END),
  Column9 = MAX(CASE WHEN rn = 9 THEN day_date ELSE NULL END)
  FROM
  dayz
  GROUP BY day_name

任何想法如何改变这个?

sql sql-server multiple-columns rows
2个回答
2
投票
您离我们并不遥远,但您按错误的内容进行分组。行号是您在每一行中想要的,但是您已经将其定义为列

WITH Days AS (SELECT day_name, day_date, RANK() OVER (PARTITION BY day_name ORDER BY day_date) AS [rn] FROM dbo.ISP_Cloud_DaysFromSession) SELECT MAX(CASE day_name WHEN 'Monday' THEN day_date END) AS Monday, MAX(CASE day_name WHEN 'Tuesday' THEN day_date END) AS Tuesday FROM Days GROUP BY rn ORDER BY rn ASC;


0
投票
您也可以使用row_number和数据透视表:

WITH Days AS( SELECT ROW_NUMBER()OVER(PARTITION BY day_name ORDER BY day_date)rr,day_name,day_date FROM ISP_Cloud_DaysFromSession ) SELECT [Monday],[Tuesday] FROM (SELECT * FROM Days)AS SOURCE PIVOT( MAX(day_date) FOR daY_name IN ([Monday],[Tuesday]) )AS pivotable

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.