繁体   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