我在 SQL Server 中使用 Pivot 時遇到了困難。
我的表有以下資料:
| ID | 日期 | 步 |
|---|---|---|
| 1 | 2022 年 1 月 1 日 | 1 |
| 1 | 2/2/2022 | 2 |
| 2 | 2022 年 1 月 1 日 | 1 |
| 2 | 2022 年 3 月 3 日 | 2 |
我需要的是以下結果:
| ID | 步驟1 | 第2步 |
|---|---|---|
| 1 | 2022 年 1 月 1 日 | 2/2/2022 |
| 2 | 2022 年 1 月 1 日 | 2022 年 3 月 3 日 |
有什么方法可以PIVOT解決這個問題嗎?或者有什么其他方法可以解決問題?
uj5u.com熱心網友回復:
假設只有 2 個步驟并且日期隨著步驟數增加,那么您可以GROUP BY在這里使用一個簡單的查詢:
SELECT ID, MIN(Date) AS Step_1, MAX(Date) AS Step_2
FROM yourTable
GROUP BY ID
ORDER BY ID;
否則,對于更健壯的查詢,請使用正式的透視邏輯:
SELECT ID,
MAX(CASE WHEN STEP = 1 THEN Date END) AS Step_1,
MAX(CASE WHEN STEP = 2 THEN Date END) AS Step_2
FROM yourTable
GROUP BY ID
ORDER BY ID;
uj5u.com熱心網友回復:
首先,除非您有充分的理由,否則請使用 Tim Biegeleisen 的答案。該PIVOT子句使用的代碼幾乎與MAX(CASE....)版本一樣多,但更難撰寫和閱讀。
而且我永遠記不起語法。我總是要查一下。
使用PIVOT,您需要
SELECT ID,
[1] as Step_1,
[2] as Step_2
FROM
(
SELECT ID,Date,Step
FROM yourTable
) AS SourceTable
PIVOT
(
MAX(Date)
FOR Step IN ([1], [2])
) AS PivotTable;
在 SQL 中,您不能有任意數量的列,或者每列有多個值。該PIVOT子句標識了Step成為列的值以及用于將可能的多個“單元格”值減少為單個值的聚合函式。
將此與此等價物進行比較:
SELECT ID,
MAX(CASE WHEN STEP = 1 THEN Date END) AS Step_1,
MAX(CASE WHEN STEP = 2 THEN Date END) AS Step_2
FROM yourTable
GROUP BY ID
ORDER BY ID;
哪個更清楚?
如果您決定每一步使用不同的聚合函式怎么辦?
SELECT ID,
MIN(CASE WHEN STEP = 1 THEN Date END) AS Step_1,
MAX(CASE WHEN STEP = 2 THEN Date END) AS Step_2
FROM yourTable
GROUP BY ID
ORDER BY ID;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/507037.html
上一篇:將JSON陣列列展平為不同的結果
