【问题标题】:Need help transposing data from one column based on criteria SQL需要帮助根据条件 SQL 从一列转置数据
【发布时间】:2021-07-22 18:50:43
【问题描述】:

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

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

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

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”是实际值。

我想要的是一个看起来像这样的表格......

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),但其他列汇总了整个表格的总数,并且仅通过表格的第一个 OperationDesc 而不是仅指定的一天 24 小时。

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

非常感谢,

【问题讨论】:

  • 您的代码不是有效的 MySQL 代码。请修复数据库标签,使其代表您真正使用的数据库。

标签: sql data-analysis


【解决方案1】:

我认为您只需要条件聚合:

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

【讨论】:

  • 您好!我已经编辑了我的代码并尝试了您的建议并且它有效 - 尽管有很多 NULL 值 - 所以更多地为我挖掘数据:p 非常感谢!
  • 我仍在努力解决的一个小问题是,查询拉取同一指定日期的 PostingType 2 和 PostingType1 数据,而我想拉取指定日期的 PostingType2 数据并拉取通过关联的 JobNo 的 PostingType1 数据,该 JobNo 将在不同的日期创建。这有意义吗?
  • @Abi 。 . .将日期条件从 WHERE 子句移动到 1WHEN 条件。
  • 我不确定你的意思?我在 CASE 子句中 PostingType = 2 之后添加了日期参数,但它并没有改变结果。我不确定是否在 PostingType = 1 的 WHEN 子句中添加日期条件,因为我不知道这些数据条目是何时创建的。
  • 在我看来,链接 PostingType 1 和 2 的逻辑是 JobNo。我可以在 PostingType 1 的 CASE 子句中添加一些东西,将其链接到 PostingType 2 的 JobNo 吗?
猜你喜欢
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
  • 2021-06-28
  • 2010-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-19
相关资源
最近更新 更多