首页 > 解决方案 > 需要帮助根据条件 SQL 转置一列中的数据

问题描述

我面临着根据日期字段汇总作业列表的总估计机器时间与总实际机器时间的挑战。问题是所有估计和实际条目都在一列中。

我需要帮助将这些数据转换为单独的列以便于分析。

这是表格外观的简化示例...

工作编号 操作说明 操作长度 数量 发布类型 开始日期和时间
345271 德斯特 1330:先生 0.33 1 1 2021-04-27 16:00
345271 德斯特 1330:奔跑 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”是实际值。

我想要的是一张看起来像这样的桌子......

工作编号 估计机器 预计时间 订购数量 机器使用 总时间 总数(量
345271 德斯特 1330 1.83 15 德斯特3 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),但其他列对整个表的总数求和,并且仅通过表的第一个 OperationDesc 而不是仅 24 小时指定的日期。

我做错了什么?有没有更好的方法来获得我需要的东西?

非常感谢,

标签: sqldata-analysis

解决方案


我想你只想要条件聚合:

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看起来像一个数字,所以我去掉了单引号。如果它确实是一个字符串,则使用单引号。不要混合数据类型。


推荐阅读