sql - 需要帮助根据条件 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 小时指定的日期。
我做错了什么?有没有更好的方法来获得我需要的东西?
非常感谢,
解决方案
我想你只想要条件聚合:
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
看起来像一个数字,所以我去掉了单引号。如果它确实是一个字符串,则使用单引号。不要混合数据类型。
推荐阅读
- ios - How to avoid a trail of delegate calls in a navigation stack?
- r - 从 R 上的 Gujarati 和 Porter 中的 logit 模型示例中复制边际效应
- c# - 了解 QuickGraph ShortestPathsDijkstra 结果
- c# - 与自定义对象的 C# 数据网格绑定
- c++ - 将 boost 变体与包含 bool 输入的 std::functions 一起使用
- amazon-s3 - 在 Clojurescript 中,如何使用 AWS javascript SDK 列出 S3 存储桶?
- nginx - nginx showing IP address instead of domain
- sql - PostgreSQL 中的动态透视
- android - 使用 IPC 的信使接口调用另一个应用程序(进程)服务
- c++ - 神经网络的作用都是一样的