2016-05-24 4 views
0

クエリ内の他の計算の結果を再処理するために、選択クエリ内の特定の計算を変数に変更します。この例では変数として必要な値はdt_rawです。これまでのところ、私はソリューションを実装することに成功しませんでした。sqlは、クエリでさらに使用するための変数としてcalculationを選択します。

SELECT 
cpe.entity_id AS product_id, 
cpe.sku, 
CASE 
    WHEN (csi.qty - csi.stock_ordered_qty) >= cped2.value AND csi.stock_id = 3 /* on stock burgsdorgstrasse */ 
     THEN 3 
    WHEN (csi.qty - csi.stock_ordered_qty) >= cped2.value AND csi.stock_id = 4 /* on stock hoppegarten */ 
     THEN 7 
    WHEN sum(sm_qty) > 2 AND csi.stock_id = 3      /* history burgsdorfstrasse */ 
     THEN round(avg(DATEDIFF(sm.sm_date, po.po_date)) + 3) 
    WHEN sum(sm_qty) > 2 AND csi.stock_id = 4      /* history hoppegarten */ 
     THEN round(avg(DATEDIFF(sm.sm_date, po.po_date)) + 4) 
     ELSE cped.value            /* default_delivery_time */ 
    END AS dt_raw 


FROM `test_live`.`catalog_product_entity` cpe 

LEFT JOIN `test_live`.`cataloginventory_stock_item` csi 
ON cpe.entity_id = csi.product_id 

LEFT JOIN `test_live`.`catalog_product_entity_decimal` cped  /* default_delivery_time */ 
ON cpe.entity_id = cped.entity_id 
AND cped.attribute_id = 392 

LEFT JOIN `test_live`.`catalog_product_entity_decimal` cped2 /* min_qty_delivery_time */ 
ON cpe.entity_id = cped2.entity_id 
AND cped2.attribute_id = 393 

LEFT JOIN `test_live`.`stock_movement` sm 
ON cpe.entity_id = sm.sm_product_id 
AND sm.sm_type = "supply" 
AND sm.sm_date > NOW() - Interval 90 DAY 

LEFT JOIN `test_live`.`purchase_order` po 
ON po.po_num = sm.sm_po_num 


WHERE 
csi.is_favorite_warehouse = 1 
AND (csi.stock_id = 3 OR csi.stock_id = 4) 

GROUP BY cpe.entity_id 

さらなる計算ではdt_rawの結果を使用します。

例:

concat ("ca. ", round(dt_raw), " weeks") as delivery_time 

CASE 
    WHEN dt_raw <= 30 
    THEN 50 
    ELSE 0 
END AS amazon_qty 
+0

は、あなたが正確に何をしたいのか明確ではありません。 – Blank

+0

さらなる計算で「dt_raw」の結果を使用したいと思います。 例:delivery_time CASE として 連結( "約"、ラウンド(dt_raw)、 "週")WHEN dt_raw <= 30 THEN amazon_qty – Turgon

+0

_further calcuations_が正確に何であるAS ELSE 0 END ? – Blank

答えて

0

あなたがrestictionsせずにクエリの結果を使用する場合は、テーブルに保存しなければなりません。その後、selectを使用して必要なデータを取得します。

テーブルを使用する利点は、あなたがいる限り、あなたのテーブルを保つよう任意の時点であなたの 計算を再現することができるということです

SELECT CONCAT('ca. ', round(dt_raw), ' weeks') AS delivery_time, 
     IF(dt_raw <= 30, 50, 0) AS amazon_qty 
FROM your_schema.dt_raw_temp; 

を選択

CREATE TABLE your_schema.dt_raw_temp 
SELECT 
cpe.entity_id AS product_id, 
cpe.sku, 
CASE 
    WHEN (csi.qty - csi.stock_ordered_qty) >= cped2.value AND csi.stock_id = 3 /* on stock burgsdorgstrasse */ 
     THEN 3 
    WHEN (csi.qty - csi.stock_ordered_qty) >= cped2.value AND csi.stock_id = 4 /* on stock hoppegarten */ 
     THEN 7 
    WHEN sum(sm_qty) > 2 AND csi.stock_id = 3      /* history burgsdorfstrasse */ 
     THEN round(avg(DATEDIFF(sm.sm_date, po.po_date)) + 3) 
    WHEN sum(sm_qty) > 2 AND csi.stock_id = 4      /* history hoppegarten */ 
     THEN round(avg(DATEDIFF(sm.sm_date, po.po_date)) + 4) 
     ELSE cped.value            /* default_delivery_time */ 
    END AS dt_raw 


FROM `test_live`.`catalog_product_entity` cpe 

LEFT JOIN `test_live`.`cataloginventory_stock_item` csi 
ON cpe.entity_id = csi.product_id 

LEFT JOIN `test_live`.`catalog_product_entity_decimal` cped  /* default_delivery_time */ 
ON cpe.entity_id = cped.entity_id 
AND cped.attribute_id = 392 

LEFT JOIN `test_live`.`catalog_product_entity_decimal` cped2 /* min_qty_delivery_time */ 
ON cpe.entity_id = cped2.entity_id 
AND cped2.attribute_id = 393 

LEFT JOIN `test_live`.`stock_movement` sm 
ON cpe.entity_id = sm.sm_product_id 
AND sm.sm_type = "supply" 
AND sm.sm_date > NOW() - Interval 90 DAY 

LEFT JOIN `test_live`.`purchase_order` po 
ON po.po_num = sm.sm_po_num 


WHERE 
csi.is_favorite_warehouse = 1 
AND (csi.stock_id = 3 OR csi.stock_id = 4) 

GROUP BY cpe.entity_id; 

をCREATE 。

0

単にあなたのクエリから選択します。

select 
    product_id, 
    sku, 
    dt_raw, 
    concat ("ca. ", round(dt_raw), " weeks") as delivery_time, 
    case when dt_raw <= 30 then 50 else 0 end as amazon_qty 
from 
(
    SELECT 
    cpe.entity_id AS product_id, 
    cpe.sku, 
    CASE 
     WHEN (csi.qty - csi.stock_ordered_qty) >= cped2.value AND csi.stock_id = 3 /* on stock burgsdorgstrasse */ 
     THEN 3 
     WHEN (csi.qty - csi.stock_ordered_qty) >= cped2.value AND csi.stock_id = 4 /* on stock hoppegarten */ 
     THEN 7 
     WHEN sum(sm.sm_qty) > 2 AND csi.stock_id = 3        /* history burgsdorfstrasse */ 
     THEN round(avg(DATEDIFF(sm.sm_date, po.po_date)) + 3) 
     WHEN sum(sm.sm_qty) > 2 AND csi.stock_id = 4        /* history hoppegarten */ 
     THEN round(avg(DATEDIFF(sm.sm_date, po.po_date)) + 4) 
     ELSE cped.value               /* default_delivery_time */ 
    END AS dt_raw 
    FROM test_live.catalog_product_entity cpe 
    LEFT JOIN test_live.cataloginventory_stock_item csi ON cpe.entity_id = csi.product_id AND csi.is_favorite_warehouse = 1 AND csi.stock_id in (3,4) 
    LEFT JOIN test_live.catalog_product_entity_decimal cped  /* default_delivery_time */ ON cpe.entity_id = cped.entity_id AND cped.attribute_id = 392 
    LEFT JOIN test_live.catalog_product_entity_decimal cped2 /* min_qty_delivery_time */ ON cpe.entity_id = cped2.entity_id AND cped2.attribute_id = 393 
    LEFT JOIN test_live.stock_movement sm ON cpe.entity_id = sm.sm_product_id AND sm.sm_type = 'supply' AND sm.sm_date > NOW() - Interval 90 DAY 
    LEFT JOIN test_live.purchase_order po ON po.po_num = sm.sm_po_num 
    GROUP BY cpe.entity_id 
) prod; 
関連する問題