需要帮助根据条件 SQL 转置一列中的数据
Need help transposing data from one column based on criteria SQL
我面临着基于日期字段总结作业列表的总估计机器时间与总实际机器时间的挑战。问题是所有估计和实际条目都在一栏中。
我需要帮助 运行将这些数据放入单独的列中以便于分析。
这是 table 的简化示例...
JobNo
OperationDesc
OperationLength
Quantity
PostingType
StartDateAndTime
345271
Durst 1330: MR
0.33
1
1
2021-04-27 16:00
345271
Durst 1330: Run
1.5
15
1
2021-04-27 16:00
345271
Durst3 IDC
0.5
3
2
2021-04-28 10:00
345271
Durst3 IDC
0.75
5
2
2021-04-28 11:00
345271
Durst3 IDC
1
10
2
2021-04-28 12:00
PostingType“1”是估计值,“2”是实际值。
我想要得到的是 table 看起来像这样....
JobNo
EstimatedMachine
EstimatedTime
QuantityOrdered
MachineUsed
TotalTime
TotalQuantity
345271
Durst 1330
1.83
15
Durst3
2.25
18
到目前为止我编写的代码是这样的..
SELECT JobNo
,(SELECT TOP 1 LEFT(OperationDesc, CHARINDEX(':', OperationDesc)-1) FROM TSE WHERE PostingType = '1') [MachineEstimated]
,(SELECT SUM(OperationLength) FROM TSE WHERE PostingType = '1') [EstimatedTime]
,(SELECT SUM(Quantity) FROM TSE WHERE PostingType = '1' AND OperationDesc NOT LIKE '%MR%') [QuantityOrdered]
,(SELECT TOP 1 LEFT(OperationDesc, CHARINDEX(' ', OperationDesc)-1) FROM TSE WHERE PostingType = '2') [MachineUsed]
,(SELECT SUM(OperationLength) FROM TSE WHERE PostingType = '2') [TotalTime]
,(SELECT SUM(Quantity) FROM TSE WHERE PostingType = '2') [TotalQuantity]
FROM TSE
WHERE StartDateAndTime >= '2021-04-28T06:00:00.000'
AND StartDateAndTime <= '2021-04-29T59:59:00.000'
GROUP BY JobNo
我得到的结果只包括所选日期(第 28 天)运行(PostingType 2)的工作编号,但其他列总计整个 table 并且只拉通过 table 的第一个 OperationDesc 而不是仅指定的 24 小时制。
我做错了什么?有没有更好的方法来获得我需要的东西?
非常感谢,
我想你只是想要条件聚合:
SELECT JobNo,
MAX(CASE WHEN PostingType = 1 THEN LEFT(OperationDesc, CHARINDEX(':', OperationDesc) - 1) END) as MachineEstimated,
SUM(CASE WHEN PostingType = 1 THEN OperationLength END) as EstimatedTime,
SUM(CASE WHEN PostingType = 1 Quantity END) as QuantityOrdered,
MAX(CASE WHEN PostingType = 2 THEN LEFT(OperationDesc, CHARINDEX(':', OperationDesc) - 1) END) as MachineUsed,
SUM(CASE WHEN PostingType = 2 THEN OperationLength END) as TotalTime,
SUM(CASE WHEN PostingType = 2 Quantity END) as TotalQuantity
FROM TSE
WHERE StartDateAndTime >= '2021-04-28T06:00:00.000' AND
StartDateAndTime <= '2021-04-29T59:59:00.000'
GROUP BY JobNo;
注意:PostingType
看起来像一个数字,所以我去掉了单引号。如果它真的是一个字符串,那么使用单引号。不要混合数据类型。
我面临着基于日期字段总结作业列表的总估计机器时间与总实际机器时间的挑战。问题是所有估计和实际条目都在一栏中。
我需要帮助 运行将这些数据放入单独的列中以便于分析。
这是 table 的简化示例...
JobNo | OperationDesc | OperationLength | Quantity | PostingType | StartDateAndTime |
---|---|---|---|---|---|
345271 | Durst 1330: MR | 0.33 | 1 | 1 | 2021-04-27 16:00 |
345271 | Durst 1330: Run | 1.5 | 15 | 1 | 2021-04-27 16:00 |
345271 | Durst3 IDC | 0.5 | 3 | 2 | 2021-04-28 10:00 |
345271 | Durst3 IDC | 0.75 | 5 | 2 | 2021-04-28 11:00 |
345271 | Durst3 IDC | 1 | 10 | 2 | 2021-04-28 12:00 |
PostingType“1”是估计值,“2”是实际值。
我想要得到的是 table 看起来像这样....
JobNo | EstimatedMachine | EstimatedTime | QuantityOrdered | MachineUsed | TotalTime | TotalQuantity |
---|---|---|---|---|---|---|
345271 | Durst 1330 | 1.83 | 15 | Durst3 | 2.25 | 18 |
到目前为止我编写的代码是这样的..
SELECT JobNo
,(SELECT TOP 1 LEFT(OperationDesc, CHARINDEX(':', OperationDesc)-1) FROM TSE WHERE PostingType = '1') [MachineEstimated]
,(SELECT SUM(OperationLength) FROM TSE WHERE PostingType = '1') [EstimatedTime]
,(SELECT SUM(Quantity) FROM TSE WHERE PostingType = '1' AND OperationDesc NOT LIKE '%MR%') [QuantityOrdered]
,(SELECT TOP 1 LEFT(OperationDesc, CHARINDEX(' ', OperationDesc)-1) FROM TSE WHERE PostingType = '2') [MachineUsed]
,(SELECT SUM(OperationLength) FROM TSE WHERE PostingType = '2') [TotalTime]
,(SELECT SUM(Quantity) FROM TSE WHERE PostingType = '2') [TotalQuantity]
FROM TSE
WHERE StartDateAndTime >= '2021-04-28T06:00:00.000'
AND StartDateAndTime <= '2021-04-29T59:59:00.000'
GROUP BY JobNo
我得到的结果只包括所选日期(第 28 天)运行(PostingType 2)的工作编号,但其他列总计整个 table 并且只拉通过 table 的第一个 OperationDesc 而不是仅指定的 24 小时制。
我做错了什么?有没有更好的方法来获得我需要的东西?
非常感谢,
我想你只是想要条件聚合:
SELECT JobNo,
MAX(CASE WHEN PostingType = 1 THEN LEFT(OperationDesc, CHARINDEX(':', OperationDesc) - 1) END) as MachineEstimated,
SUM(CASE WHEN PostingType = 1 THEN OperationLength END) as EstimatedTime,
SUM(CASE WHEN PostingType = 1 Quantity END) as QuantityOrdered,
MAX(CASE WHEN PostingType = 2 THEN LEFT(OperationDesc, CHARINDEX(':', OperationDesc) - 1) END) as MachineUsed,
SUM(CASE WHEN PostingType = 2 THEN OperationLength END) as TotalTime,
SUM(CASE WHEN PostingType = 2 Quantity END) as TotalQuantity
FROM TSE
WHERE StartDateAndTime >= '2021-04-28T06:00:00.000' AND
StartDateAndTime <= '2021-04-29T59:59:00.000'
GROUP BY JobNo;
注意:PostingType
看起来像一个数字,所以我去掉了单引号。如果它真的是一个字符串,那么使用单引号。不要混合数据类型。