简体   繁体   English

sql将select calcuation声明为变量以在查询中进一步使用

[英]sql declare select calcuation as variable for further use in query

I want to change a specific calculation inside a select query to a variable in order to re-process the result for other calculations inside the query. 我想将选择查询内的特定计算更改为变量,以便为查询内的其他计算重新处理结果。 In this example the value I need as variable is dt_raw . 在此示例中,我需要作为变量的值为dt_raw So far I wasn't successful with implementing a solution. 到目前为止,我并没有成功实施解决方案。

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

I want to use the results of dt_raw in further calcuations. 我想在进一步的计算中使用dt_raw的结果。

eg: 例如:

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

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

If you want to use your query result without restictions you should save it in a table. 如果要使用查询结果而没有限制,则应将其保存在表中。 After that use a select to get the data you want. 之后,使用选择获取所需的数据。

CREATE 创造

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;

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;

The advantage of using tables is that you can reproduce your calculations at any given moment as long as you keep your tables. 使用表格的好处是,只要保留表格,就可以在任何给定的时刻重现计算结果。

Simply select from your query: 只需从查询中选择:

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;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM