如何合并具有不同标志的同一个表中的数据?

发布于 2025-01-16 09:43:35 字数 1254 浏览 0 评论 0原文

我正在尝试提取包含作业编号、订单编号、零件编号和说明的数据。我的表格中的某些行被标记为“L”(表示人工)和“M”(表示材料)。 L 标记的行可以按字面意思理解,hours_worked = 工作总时间,人工 = 人工成本,间接费用 = 间接费用成本。 M 标记行不同,hours_worked = 购买数量,amount_labor = 材料购买价格。如何区分这两个标志并将其打印到同一个表中?

这是我到目前为止所得到的:

SELECT 
DETAIL.JOB, 
DETAIL.SUFFIX, 
ORDER.ORDER_NO, 
ORDER.ORDER_LINE,
ORDER.PART,
DETAIL.SEQ, 
OPERATIONS.DESCRIPTION,
SUM(lbr.Hours) AS sum_hours,
SUM(lbr.Labor) AS sum_labor,
SUM(lbr.Overhead) AS sum_overhead, 
SUM(mtl.Qty) AS sum_qty,
SUM(mtl.material) AS sum_mtl
FROM 
    (SELECT 
    DETAIL.HOURS_WORKED AS Hours,
    DETAIL.AMOUNT_LABOR AS Labor,
    DETAIL.AMT_OVERHEAD AS Overhead
    FROM
    GT.DETAIL DETAIL
    WHERE
    DETAIL.LMO = 'L') AS lbr,
    (SELECT
    DETAIL.HOURS_WORKED AS Qty,
    DETAIL.AMOUNT_LABOR AS Material
    FROM
    GT.DETAIL DETAIL
    WHERE
    DETAIL.LMO = 'M') AS mtl,
GT.DETAIL DETAIL,
GT.OPERATIONS OPERATIONS, 
GT.ORDER ORDER  
WHERE 
ORDER.JOB = DETAIL.JOB AND
ORDER.SUFFIX = DETAIL.SUFFIX AND
DETAIL.JOB = OPERATIONS.JOB AND
DETAIL.SEQ = OPERATIONS.SEQ AND
DETAIL.SUFFIX = OPERATIONS.SUFFIX
GROUP BY
DETAIL.JOB, 
DETAIL.SUFFIX, 
ORDER.ORDER_NO, 
ORDER.ORDER_LINE,
ORDER.PART,
DETAIL.SEQ, 
OPERATIONS.DESCRIPTION

每次我运行上面的代码时,它都会永远运行并最终崩溃。预先感谢您的任何想法。

I'm trying to pull data that contains a job number, order number, part number and description. Some rows in my table are flagged as 'L' for Labor and 'M' for Material. L flagged rows can be taken literally, hours_worked = total hours on job, labor = cost of labor, overhead = cost of overhead. M flagged rows are different, hours_worked = quantity purchased and amount_labor = purchase price of material. How can I differentiate between these two flags and print it into the same table?

Here is what I have so far:

SELECT 
DETAIL.JOB, 
DETAIL.SUFFIX, 
ORDER.ORDER_NO, 
ORDER.ORDER_LINE,
ORDER.PART,
DETAIL.SEQ, 
OPERATIONS.DESCRIPTION,
SUM(lbr.Hours) AS sum_hours,
SUM(lbr.Labor) AS sum_labor,
SUM(lbr.Overhead) AS sum_overhead, 
SUM(mtl.Qty) AS sum_qty,
SUM(mtl.material) AS sum_mtl
FROM 
    (SELECT 
    DETAIL.HOURS_WORKED AS Hours,
    DETAIL.AMOUNT_LABOR AS Labor,
    DETAIL.AMT_OVERHEAD AS Overhead
    FROM
    GT.DETAIL DETAIL
    WHERE
    DETAIL.LMO = 'L') AS lbr,
    (SELECT
    DETAIL.HOURS_WORKED AS Qty,
    DETAIL.AMOUNT_LABOR AS Material
    FROM
    GT.DETAIL DETAIL
    WHERE
    DETAIL.LMO = 'M') AS mtl,
GT.DETAIL DETAIL,
GT.OPERATIONS OPERATIONS, 
GT.ORDER ORDER  
WHERE 
ORDER.JOB = DETAIL.JOB AND
ORDER.SUFFIX = DETAIL.SUFFIX AND
DETAIL.JOB = OPERATIONS.JOB AND
DETAIL.SEQ = OPERATIONS.SEQ AND
DETAIL.SUFFIX = OPERATIONS.SUFFIX
GROUP BY
DETAIL.JOB, 
DETAIL.SUFFIX, 
ORDER.ORDER_NO, 
ORDER.ORDER_LINE,
ORDER.PART,
DETAIL.SEQ, 
OPERATIONS.DESCRIPTION

Every time I run the above, it runs forever and eventually crashes. Thanks in advance for any ideas.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

舂唻埖巳落 2025-01-23 09:43:35

SQL 已知 LEFT/RIGHT/INNER JOIN 语法已有一段时间了。即使使用像 Pervasive 这样的数据库,您也可以使用这种 JOIN(更多信息:要踢的坏习惯:使用旧式连接

我尝试重写您的查询,使用内部连接。

SELECT 
   DETAIL.JOB, 
   DETAIL.SUFFIX, 
   ORDER.ORDER_NO, 
   ORDER.ORDER_LINE,
   ORDER.PART,
   DETAIL.SEQ, 
   OPERATIONS.DESCRIPTION,
   SUM(CASE WHEN LMO='L' THEN DETAIL.Hours END) AS sum_hours,
   SUM(CASE WHEN LMO='L' THEN DETAIL.Labor END) AS sum_labor,
   SUM(CASE WHEN LMO='L' THEN DETAIL.Overhead END) AS sum_overhead, 
   SUM(CASE WHEN LMO='M' THEN DETAIL.Qty END) AS sum_qty,
   SUM(CASE WHEN LMO='M' THEN DETAIL.material END) AS sum_mtl
FROM
   GT.DETAIL DETAIL
INNER JOIN GT.OPERATIONS OPERATIONS ON OPERATIONS.JOB = DETAIL.JOB 
                                   AND OPERATIONS.SEQ = DETAIL.SEQ 
                                   AND OPERATIONS.SUFFIX = DETAIL.SUFFIX
INNER JOIN GT.ORDER ORDER ON ORDER.JOB = DETAIL.JOB
                         AND ORDER.SUFFIX = DETAIL.SUFFIX

WHERE
   GT.DETAIL.LMO IN ('L','M')

GROUP BY
   DETAIL.JOB, 
   DETAIL.SUFFIX, 
   ORDER.ORDER_NO, 
   ORDER.ORDER_LINE,
   ORDER.PART,
   DETAIL.SEQ, 
   OPERATIONS.DESCRIPTION

情况添加到 SUM() 中以进行正确的计算。

我不确定您是否需要WHERE GT.DETAIL.LMO IN ('L','M')。当您还需要选择 LMO 以及 L 和/或 M 的其他值时,您应该删除 WHERE 子句。

SQL has known LEFT/RIGHT/INNER JOIN syntax for some time now. Even when using a database like Pervasive you can use that kind of JOINs too (More info: Bad Habits to Kick : Using old-style JOINs)

I tried to do a re-write of your query, using INNER JOINs.

SELECT 
   DETAIL.JOB, 
   DETAIL.SUFFIX, 
   ORDER.ORDER_NO, 
   ORDER.ORDER_LINE,
   ORDER.PART,
   DETAIL.SEQ, 
   OPERATIONS.DESCRIPTION,
   SUM(CASE WHEN LMO='L' THEN DETAIL.Hours END) AS sum_hours,
   SUM(CASE WHEN LMO='L' THEN DETAIL.Labor END) AS sum_labor,
   SUM(CASE WHEN LMO='L' THEN DETAIL.Overhead END) AS sum_overhead, 
   SUM(CASE WHEN LMO='M' THEN DETAIL.Qty END) AS sum_qty,
   SUM(CASE WHEN LMO='M' THEN DETAIL.material END) AS sum_mtl
FROM
   GT.DETAIL DETAIL
INNER JOIN GT.OPERATIONS OPERATIONS ON OPERATIONS.JOB = DETAIL.JOB 
                                   AND OPERATIONS.SEQ = DETAIL.SEQ 
                                   AND OPERATIONS.SUFFIX = DETAIL.SUFFIX
INNER JOIN GT.ORDER ORDER ON ORDER.JOB = DETAIL.JOB
                         AND ORDER.SUFFIX = DETAIL.SUFFIX

WHERE
   GT.DETAIL.LMO IN ('L','M')

GROUP BY
   DETAIL.JOB, 
   DETAIL.SUFFIX, 
   ORDER.ORDER_NO, 
   ORDER.ORDER_LINE,
   ORDER.PART,
   DETAIL.SEQ, 
   OPERATIONS.DESCRIPTION

The CASE WHEN is added to the SUM() to make the correct calculations.

I am not sure if you need WHERE GT.DETAIL.LMO IN ('L','M'). When you have other values for LMO then L and/or M which need to be selected too, you should remove the WHERE clause.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文