![](/img/trans.png)
[英]PL/SQL to select a number of items based on the value of a row in other table
[英]Row items into column based on row number present in SQL Server table
我在 SQL Server 表中設置了一組車輛故障部件,如下所示:
Vehicle_ID | 失敗的部分 | 行號 |
---|---|---|
1 | 0001 | 1 |
1 | 0002 | 1 |
1 | 0003 | 1 |
1 | 0001 | 2 |
1 | 0006 | 2 |
1 | 0007 | 2 |
1 | 0001 | 3 |
1 | 0009 | 3 |
2 | 0001 | 1 |
2 | 0002 | 1 |
2 | 0003 | 2 |
2 | 0007 | 2 |
3 | 0006 | 1 |
3 | 0007 | 1 |
4 | 0011 | 1 |
4 | 0015 | 1 |
4 | 0016 | 1 |
RowNumber
是我們必須定義行的列。 結果表如下。 failed part
列計數的最大數量為 5。
Vehicle_ID | 第 1 部分失敗 | 第 2 部分失敗 | 失敗的第 3 部分 | 失敗第 4 部分 | 失敗的第 5 部分 |
---|---|---|---|---|---|
1 | 0001 | 0002 | 0003 | ||
1 | 0001 | 0006 | 0007 | ||
1 | 0001 | 0009 | |||
2 | 0001 | 0002 | |||
2 | 0003 | 0007 | |||
3 | 0006 | 0007 | |||
4 | 0011 | 0015 | 0016 |
我嘗試了以下陳述,但無法得出確切的結果。
WITH cte AS
(
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY Vehicle_ID,RowNumber)
ORDER BY [Failed Part]) rn
FROM
VehicleTable
)
SELECT
Vehicle_ID,
MAX(CASE WHEN rn = 1 THEN [Failed Part] END) AS FailedPart1,
MAX(CASE WHEN rn = 2 THEN [Failed Part] END) AS FailedPart2,
MAX(CASE WHEN rn = 3 THEN [Failed Part] END) AS FailedPart3,
MAX(CASE WHEN rn = 4 THEN [Failed Part] END) AS FailedPart4,
MAX(CASE WHEN rn = 5 THEN [Failed Part] END) AS FailedPart5
FROM
cte
GROUP BY
Vehicle_ID
您的代碼中的問題非常微妙。 您正在做的是對Vehicle_ID
進行分組,問題是輸出表中的每個Vehicle_ID
都有不止一行。 相反,您應該做的是通過對您在 cte 中計算的列號rn
進行分組來修復它:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY Vehicle_ID, RowNumber
ORDER BY [Failed Part]) rn
FROM VehicleTable
)
SELECT
Vehicle_ID,
MAX(CASE WHEN rn = 1 THEN [Failed Part] END) AS FailedPart1,
MAX(CASE WHEN rn = 2 THEN [Failed Part] END) AS FailedPart2,
MAX(CASE WHEN rn = 3 THEN [Failed Part] END) AS FailedPart3,
MAX(CASE WHEN rn = 4 THEN [Failed Part] END) AS FailedPart4,
MAX(CASE WHEN rn = 5 THEN [Failed Part] END) AS FailedPart5
FROM cte
GROUP BY
Vehicle_ID, rn
如果您希望您的行在輸出中排序,您只需在最后添加ORDER BY Vehicle_ID, rn
。
在這里試試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.