簡體   English   中英

根據 SQL Server 表中存在的行號將行項放入列中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM