2010-07-09 7 views
0

J'ai une grande requête comme suit, quelqu'un s'il vous plaît modifier cette requête? je dois éviter ce grand groupe par ... :-)Tweak requête SQL aide

SELECT COALESCE(SUM(total_retail), 0) total_retail, 
     COALESCE(SUM(meterial_sub_total), 0) meterial_sub_total, 
     COALESCE(MIN(po_template_group_by_code), 0) po_template_group_by_code, 
     COALESCE(MIN(po_template_sort_by_code), 0) po_template_sort_by_code 
FROM 
(
SELECT 
    COALESCE( CASE WHEN COALESCE(ihbol.valuation_method_code, pih.valuation_method_code, @default_valuation_method_code, 'i') IN ('r', 'i', 'l') THEN 
         COALESCE (rmiretail.retail_price/rmiretail.unit_of_measure_quantity 
           /COALESCE(uomcvrmi.atomic_conversion_factor * UOMrmi.factor, UOMrmi.factor), 0) 
            * poi.confirmed_quantity 
            * (CASE WHEN poi.catch_weight_flag = 'y' 
              THEN (poi.package_weight * COALESCE(uomcvpr.atomic_conversion_factor * UOMpr.factor, UOMpr.factor)) 
              WHEN si.shipper_flag = 'y' 
              THEN (meterial_data.linked_meterial_quantity * COALESCE(uomcvitm.atomic_conversion_factor * uomitm.factor, uomitm.factor)) 
              ELSE (COALESCE(uomcvpkg.atomic_conversion_factor * UOMpkg.factor, UOMpkg.factor)) 
             END) 
        ELSE 
         NULL 
        END, 0) AS total_retail, 
    CASE WHEN MIN(s.rcv_using_po_default_cost_target_code) = 'p' AND MIN(po.status_code) <> 't' 
     THEN COALESCE(MIN(po.last_draft_total), 0) 
     ELSE CASE WHEN meterial_data.linked_meterial_quantity IS NULL 
         THEN CASE WHEN poi.catch_weight_flag = 'y' 
            THEN COALESCE(poi.confirmed_quantity * poi.package_weight * spicost.net_supplier_price, 0) 
            ELSE COALESCE(poi.confirmed_quantity * spicost.net_supplier_price, 0) 
           END 
         ELSE 0 
        END 
    END AS meterial_sub_total 
    ,po.po_template_group_by_code AS po_template_group_by_code 
    ,po.po_template_sort_by_code AS po_template_sort_by_code 

FROM purchase_order po 

JOIN supplier s WITH (NOLOCK) 
ON po.supplier_id = s.supplier_id 

JOIN purchase_order_meterial poi WITH (NOLOCK) 
ON po.purchase_order_id = poi.purchase_order_id 
AND po.business_unit_id = poi.business_unit_id 

JOIN supplier_meterial si WITH (NOLOCK) 
ON poi.supplier_meterial_id = si.supplier_meterial_id 
AND poi.supplier_id  = si.supplier_id 

JOIN supplier_packaged_meterial spi WITH (NOLOCK) 
ON spi.supplier_meterial_id = si.supplier_meterial_id 
AND spi.supplier_id  = @supplier_id:int 

JOIN unit_of_measure uompkg WITH (NOLOCK) 
ON uompkg.unit_of_measure_id = spi.packaged_in_uom_id 

JOIN merch_bu_spi_cost_list spicost WITH (NOLOCK) 
ON spicost.business_unit_id = @bu_id:int 
AND spicost.supplier_id  = si.supplier_id 
AND spicost.supplier_meterial_id = si.supplier_meterial_id 
AND spicost.packaged_meterial_id = spi.packaged_meterial_id 

LEFT OUTER JOIN 
    (
    SELECT poi.supplier_meterial_id AS supplier_meterial_id, 
      si.meterial_id   AS linked_meterial_id, 
      NULL     AS linked_meterial_uom, 
      NULL     AS linked_meterial_quantity 

    FROM purchase_order_meterial poi WITH (NOLOCK) 

    JOIN supplier_meterial si WITH (NOLOCK) 
    ON  poi.supplier_meterial_id = si.supplier_meterial_id 

    WHERE poi.purchase_order_id = @po_id:int 
    AND  poi.business_unit_id = @bu_id:int 

    UNION ALL 

    SELECT siil.supplier_meterial_id  AS supplier_meterial_id, 
      siil.inventory_meterial_id  AS linked_meterial_id, 
      siil.unit_of_measure_id  AS linked_meterial_uom, 
      siil.inventory_meterial_quantity AS linked_meterial_quantity 

    FROM purchase_order_meterial poi WITH (NOLOCK) 

    JOIN supplier_inventory_meterial_list siil WITH (NOLOCK) 
    ON  siil.supplier_id = @supplier_id:int 
    AND  poi.supplier_meterial_id = siil.supplier_meterial_id 

    WHERE poi.purchase_order_id = @po_id:int 
    AND  poi.business_unit_id = @bu_id:int 

) meterial_data 
ON meterial_data.supplier_meterial_id    = si.supplier_meterial_id 

LEFT OUTER JOIN meterial      i 
ON i.meterial_id        = meterial_data.linked_meterial_id 

LEFT OUTER JOIN meterial_hierarchy    ih 
ON ih.meterial_hierarchy_id     = COALESCE(si.meterial_hierarchy_id, i.meterial_hierarchy_id) 

LEFT OUTER JOIN meterial_hierarchy    pih 
ON ih.setstring       LIKE pih.setstring + '%' 
AND pih.meterial_hierarchy_level_id   = @meterial_hierarchy_level_id 

LEFT OUTER JOIN meterial_hierarchy_bu_override_list ihbol 
ON ihbol.business_unit_id    = @bu_id:int 
AND ihbol.meterial_hierarchy_id    = pih.meterial_hierarchy_id 

LEFT OUTER JOIN retail_modified_meterial  rmi WITH (NOLOCK) 
ON meterial_data.linked_meterial_id    = rmi.retail_meterial_id 
AND rmi.retail_valuation_flag    = 'y' 

LEFT OUTER JOIN merch_bu_rmi_retail_list rmiretail WITH (NOLOCK) 
ON rmiretail.retail_modified_meterial_id  = rmi.retail_modified_meterial_id 
AND rmiretail.business_unit_id   = @bu_id:int 

LEFT OUTER JOIN unit_of_measure  uompr WITH (NOLOCK) 
ON uompr.unit_of_measure_id    = spi.priced_in_uom_id 

LEFT OUTER JOIN unit_of_measure  uomitm WITH (NOLOCK) 
ON uomitm.unit_of_measure_id    = meterial_data.linked_meterial_uom 

LEFT OUTER JOIN unit_of_measure  uomrmi WITH (NOLOCK) 
ON uomrmi.unit_of_measure_id    = rmi.unit_of_measure_id 

LEFT OUTER JOIN meterial_uom_conversion uomcvitm WITH (NOLOCK) 
ON meterial_data.linked_meterial_id    = uomcvitm.meterial_id 
AND uomitm.unit_of_measure_class_id  = uomcvitm.unit_of_measure_class_id 

LEFT OUTER JOIN meterial_uom_conversion uomcvrmi WITH (NOLOCK) 
ON meterial_data.linked_meterial_id    = uomcvrmi.meterial_id 
AND uomrmi.unit_of_measure_class_id  = uomcvrmi.unit_of_measure_class_id 

LEFT OUTER JOIN meterial_uom_conversion uomcvpr WITH (NOLOCK) 
ON uomcvpr.meterial_id      = meterial_data.linked_meterial_id 
AND uomcvpr.unit_of_measure_class_id  = uompr.unit_of_measure_class_id 

LEFT OUTER JOIN meterial_uom_conversion uomcvpkg WITH (NOLOCK) 
ON uomcvpkg.meterial_id      = meterial_data.linked_meterial_id 
AND uomcvpkg.unit_of_measure_class_id  = uompkg.unit_of_measure_class_id 

WHERE po.purchase_order_id = @po_id:int 
AND po.business_unit_id = @bu_id:int 


GROUP BY poi.supplier_meterial_id, poi.confirmed_quantity, spicost.net_supplier_price, 
     meterial_data.linked_meterial_quantity,poi.catch_weight_flag,poi.package_weight, 
     ihbol.valuation_method_code, pih.valuation_method_code,rmiretail.retail_price, 
     rmiretail.unit_of_measure_quantity, uomcvrmi.atomic_conversion_factor, UOMrmi.factor, 
     UOMrmi.factor, uomcvpr.atomic_conversion_factor, UOMpr.factor, si.shipper_flag, 
     meterial_data.linked_meterial_quantity, uomcvitm.atomic_conversion_factor ,uomitm.factor, 
     uomitm.factor, uomcvpkg.atomic_conversion_factor,UOMpkg.factor, UOMpkg.factor, 
     po.po_template_group_by_code, po.po_template_sort_by_code 

) resultTable 
+1

Sans données, table defs, ou un plan d'expliquer, il sera difficile pour les gens de répondre de manière significative. – MJB

+0

c'est une requête diabolique à coup sûr! ... –

+0

C'est sûr que c'est un monstre alors encore une fois j'ai vu une table de 22 rejoindre avant mais pourriez-vous s'il vous plaît poster des structures de table au minimum? J'apprécie aussi l'orthographe de "meterial" dans le SQL. –

Répondre

1

Essayez:

SELECT COALESCE(SUM(total_retail), 0) total_retail, 
     COALESCE(SUM(meterial_sub_total), 0) meterial_sub_total, 
     COALESCE(MIN(po_template_group_by_code), 0) po_template_group_by_code, 
     COALESCE(MIN(po_template_sort_by_code), 0) po_template_sort_by_code 
FROM 
(
SELECT 
    sum(COALESCE( CASE WHEN COALESCE(ihbol.valuation_method_code, pih.valuation_method_code, @default_valuation_method_code, 'i') IN ('r', 'i', 'l') THEN 
         COALESCE (rmiretail.retail_price/rmiretail.unit_of_measure_quantity 
           /COALESCE(uomcvrmi.atomic_conversion_factor * UOMrmi.factor, UOMrmi.factor), 0) 
            * poi.confirmed_quantity 
            * (CASE WHEN poi.catch_weight_flag = 'y' 
              THEN (poi.package_weight * COALESCE(uomcvpr.atomic_conversion_factor * UOMpr.factor, UOMpr.factor)) 
              WHEN si.shipper_flag = 'y' 
              THEN (meterial_data.linked_meterial_quantity * COALESCE(uomcvitm.atomic_conversion_factor * uomitm.factor, uomitm.factor)) 
              ELSE (COALESCE(uomcvpkg.atomic_conversion_factor * UOMpkg.factor, UOMpkg.factor)) 
             END) 
        ELSE 
         NULL 
        END, 0)) AS total_retail, 
    sum(CASE WHEN MIN(s.rcv_using_po_default_cost_target_code) = 'p' AND MIN(po.status_code) <> 't' 
     THEN COALESCE(MIN(po.last_draft_total), 0) 
     ELSE CASE WHEN meterial_data.linked_meterial_quantity IS NULL 
         THEN CASE WHEN poi.catch_weight_flag = 'y' 
            THEN COALESCE(poi.confirmed_quantity * poi.package_weight * spicost.net_supplier_price, 0) 
            ELSE COALESCE(poi.confirmed_quantity * spicost.net_supplier_price, 0) 
           END 
         ELSE 0 
        END 
    END) AS meterial_sub_total 
    ,po.po_template_group_by_code AS po_template_group_by_code 
    ,po.po_template_sort_by_code AS po_template_sort_by_code 

FROM purchase_order po 

JOIN supplier s WITH (NOLOCK) 
ON po.supplier_id = s.supplier_id 

JOIN purchase_order_meterial poi WITH (NOLOCK) 
ON po.purchase_order_id = poi.purchase_order_id 
AND po.business_unit_id = poi.business_unit_id 

JOIN supplier_meterial si WITH (NOLOCK) 
ON poi.supplier_meterial_id = si.supplier_meterial_id 
AND poi.supplier_id  = si.supplier_id 

JOIN supplier_packaged_meterial spi WITH (NOLOCK) 
ON spi.supplier_meterial_id = si.supplier_meterial_id 
AND spi.supplier_id  = @supplier_id:int 

JOIN unit_of_measure uompkg WITH (NOLOCK) 
ON uompkg.unit_of_measure_id = spi.packaged_in_uom_id 

JOIN merch_bu_spi_cost_list spicost WITH (NOLOCK) 
ON spicost.business_unit_id = @bu_id:int 
AND spicost.supplier_id  = si.supplier_id 
AND spicost.supplier_meterial_id = si.supplier_meterial_id 
AND spicost.packaged_meterial_id = spi.packaged_meterial_id 

LEFT OUTER JOIN 
    (
    SELECT poi.supplier_meterial_id AS supplier_meterial_id, 
      si.meterial_id   AS linked_meterial_id, 
      NULL     AS linked_meterial_uom, 
      NULL     AS linked_meterial_quantity 

    FROM purchase_order_meterial poi WITH (NOLOCK) 

    JOIN supplier_meterial si WITH (NOLOCK) 
    ON  poi.supplier_meterial_id = si.supplier_meterial_id 

    WHERE poi.purchase_order_id = @po_id:int 
    AND  poi.business_unit_id = @bu_id:int 

    UNION ALL 

    SELECT siil.supplier_meterial_id  AS supplier_meterial_id, 
      siil.inventory_meterial_id  AS linked_meterial_id, 
      siil.unit_of_measure_id  AS linked_meterial_uom, 
      siil.inventory_meterial_quantity AS linked_meterial_quantity 

    FROM purchase_order_meterial poi WITH (NOLOCK) 

    JOIN supplier_inventory_meterial_list siil WITH (NOLOCK) 
    ON  siil.supplier_id = @supplier_id:int 
    AND  poi.supplier_meterial_id = siil.supplier_meterial_id 

    WHERE poi.purchase_order_id = @po_id:int 
    AND  poi.business_unit_id = @bu_id:int 

) meterial_data 
ON meterial_data.supplier_meterial_id    = si.supplier_meterial_id 

LEFT OUTER JOIN meterial      i 
ON i.meterial_id        = meterial_data.linked_meterial_id 

LEFT OUTER JOIN meterial_hierarchy    ih 
ON ih.meterial_hierarchy_id     = COALESCE(si.meterial_hierarchy_id, i.meterial_hierarchy_id) 

LEFT OUTER JOIN meterial_hierarchy    pih 
ON ih.setstring       LIKE pih.setstring + '%' 
AND pih.meterial_hierarchy_level_id   = @meterial_hierarchy_level_id 

LEFT OUTER JOIN meterial_hierarchy_bu_override_list ihbol 
ON ihbol.business_unit_id    = @bu_id:int 
AND ihbol.meterial_hierarchy_id    = pih.meterial_hierarchy_id 

LEFT OUTER JOIN retail_modified_meterial  rmi WITH (NOLOCK) 
ON meterial_data.linked_meterial_id    = rmi.retail_meterial_id 
AND rmi.retail_valuation_flag    = 'y' 

LEFT OUTER JOIN merch_bu_rmi_retail_list rmiretail WITH (NOLOCK) 
ON rmiretail.retail_modified_meterial_id  = rmi.retail_modified_meterial_id 
AND rmiretail.business_unit_id   = @bu_id:int 

LEFT OUTER JOIN unit_of_measure  uompr WITH (NOLOCK) 
ON uompr.unit_of_measure_id    = spi.priced_in_uom_id 

LEFT OUTER JOIN unit_of_measure  uomitm WITH (NOLOCK) 
ON uomitm.unit_of_measure_id    = meterial_data.linked_meterial_uom 

LEFT OUTER JOIN unit_of_measure  uomrmi WITH (NOLOCK) 
ON uomrmi.unit_of_measure_id    = rmi.unit_of_measure_id 

LEFT OUTER JOIN meterial_uom_conversion uomcvitm WITH (NOLOCK) 
ON meterial_data.linked_meterial_id    = uomcvitm.meterial_id 
AND uomitm.unit_of_measure_class_id  = uomcvitm.unit_of_measure_class_id 

LEFT OUTER JOIN meterial_uom_conversion uomcvrmi WITH (NOLOCK) 
ON meterial_data.linked_meterial_id    = uomcvrmi.meterial_id 
AND uomrmi.unit_of_measure_class_id  = uomcvrmi.unit_of_measure_class_id 

LEFT OUTER JOIN meterial_uom_conversion uomcvpr WITH (NOLOCK) 
ON uomcvpr.meterial_id      = meterial_data.linked_meterial_id 
AND uomcvpr.unit_of_measure_class_id  = uompr.unit_of_measure_class_id 

LEFT OUTER JOIN meterial_uom_conversion uomcvpkg WITH (NOLOCK) 
ON uomcvpkg.meterial_id      = meterial_data.linked_meterial_id 
AND uomcvpkg.unit_of_measure_class_id  = uompkg.unit_of_measure_class_id 

WHERE po.purchase_order_id = @po_id:int 
AND po.business_unit_id = @bu_id:int 


GROUP BY po.po_template_group_by_code, po.po_template_sort_by_code 

) resultTable 

Je pense qu'il devrait retourner les mêmes résultats que la requête ci-dessus, bien que ces résultats sont ce que vous En fait voulez est une question différente ...