按日期名称转换列中的行
Transform rows in columns by Day Name
我有这个table
|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
有什么想法可以改变它吗?
你离得不远,但你按错误的事物分组。行号是您在每一行中想要的,但您已将其定义为您的列
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;
您还可以使用 row_number
和 pivot
:
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
我有这个table
|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
有什么想法可以改变它吗?
你离得不远,但你按错误的事物分组。行号是您在每一行中想要的,但您已将其定义为您的列
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;
您还可以使用 row_number
和 pivot
:
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