0

以下のビューは正しい結果を返しません。Plan_Id と PartNum でグループ化された Picked、Printed、Scanned の合計を取得しようとしています。子テーブルに対応するレコードがあるかどうかに関係なく、正しい合計を返す必要があります。3 つの異なるビューを使用してそれらを結合する方法は知っていますが、1 つのビューですべてを行うにはどうすればよいですか? どんな助けでも感謝します。

SELECT
    `prod_plan`.`Prp_ProdPlanId` AS `PlanId`,
    `prod_plan`.`Prp_PartNum` AS `PartNum`,
    sum(`prod_plan`.`Prp_Picked`) AS `Picked`,
    sum(`printed`.`PtQty`) AS `Printed`,
    sum(`scanned`.`PtQty`) AS `Scanned`
FROM
    (
        (
            `prod_plan`
            LEFT JOIN `product_trans` `printed` ON (
                (
                    (
                        `printed`.`PtPlanId` = `prod_plan`.`Prp_ProdPlanId`
                    )
                    AND (
                        `printed`.`PtPartNum` = `prod_plan`.`Prp_PartNum`
                    )
                )
            )
        )
            LEFT JOIN `product_trans` `scanned` ON (
            (
            (
                `scanned`.`PtPlanId` = `prod_plan`.`Prp_ProdPlanId`
            )
            AND (
                `scanned`.`PtPartNum` = `prod_plan`.`Prp_PartNum`
            )
        )
    )
)
WHERE
    (
        (
            `printed`.`PtPart` = 'Barcode Print'
        )
        AND (
            `scanned`.`PtPart` = 'Barcode Scan'
        )
    )
GROUP BY
    `prod_plan`.`Prp_ProdPlanId`,
    `prod_plan`.`Prp_PartNum`
4

2 に答える 2

0

句をチェックPtPartインする必要があります。ONそうしないと、子テーブルに一致しない行が取得されません。これらの列はNULL.

SELECT
    `prod_plan`.`Prp_ProdPlanId` AS `PlanId`,
    `prod_plan`.`Prp_PartNum` AS `PartNum`,
    sum(`prod_plan`.`Prp_Picked`) AS `Picked`,
    sum(`printed`.`PtQty`) AS `Printed`,
    sum(`scanned`.`PtQty`) AS `Scanned`
FROM `prod_plan`
LEFT JOIN `product_trans` `printed`
ON `printed`.`PtPlanId` = `prod_plan`.`Prp_ProdPlanId`
    AND `printed`.`PtPartNum` = `prod_plan`.`Prp_PartNum`
    AND `printed`.`PtPart` = 'Barcode Print'
LEFT JOIN `product_trans` `scanned`
ON `scanned`.`PtPlanId` = `prod_plan`.`Prp_ProdPlanId`
    AND `scanned`.`PtPartNum` = `prod_plan`.`Prp_PartNum`
    AND `scanned`.`PtPart` = 'Barcode Scan'
GROUP BY
    `prod_plan`.`Prp_ProdPlanId`,
    `prod_plan`.`Prp_PartNum`
于 2013-02-26T01:01:04.777 に答える
0

これが私がやったことです。以下は、正しく機能する 3 つのビューです。

v_trans_printed:

SELECT
product_trans.PtPlanId AS PlanId,
product_trans.PtLot AS Lot,
product_trans.PtPartNum AS PartNum,
Sum(product_trans.PtQty) AS Printed
FROM
product_trans
WHERE
product_trans.PtPart = 'Barcode Print'
GROUP BY
product_trans.PtPlanId,
product_trans.PtLot,
product_trans.PtPartNum

v_trans_scanned:

SELECT
product_trans.PtPlanId AS PlanId,
product_trans.PtLot AS Lot,
product_trans.PtPartNum AS PartNum,
Sum(product_trans.PtQty) AS Scanned
FROM
product_trans
WHERE
product_trans.PtPart = 'Barcode Scan'
GROUP BY
product_trans.PtPlanId,
product_trans.PtLot,
product_trans.PtPartNum

そして、ここにそれらをすべてまとめました。これは正しい結果を返します。

vSELECT
prod_plan.Prp_ProdPlanId AS PlanId,
prod_plan.Prp_Lot AS Lot,
prod_plan.Prp_PartNum AS PartNum,
Sum(prod_plan.Prp_Picked) AS Picked,
Printed.Printed AS Printed,
Scanned.Scanned AS Scanned
FROM
prod_plan
LEFT JOIN v_trans_printed AS Printed ON Printed.PlanId = prod_plan.Prp_ProdPlanId AND Printed.Lot = prod_plan.Prp_Lot AND Printed.PartNum = prod_plan.Prp_PartNum
LEFT JOIN v_trans_scanned AS Scanned ON Scanned.PlanId = prod_plan.Prp_ProdPlanId AND Scanned.Lot = prod_plan.Prp_Lot AND Scanned.PartNum = prod_plan.Prp_PartNum
GROUP BY
prod_plan.Prp_ProdPlanId,
prod_plan.Prp_Lot,
prod_plan.Prp_PartNum

しかし、1 つのビューを使用できればさらに良いでしょう。

注: 最初は偶然に Lot を省略しました。でも結果には影響しませんでしたw。サンプル データ セット。

于 2013-02-26T15:44:34.857 に答える