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