簡體   English   中英

使用不存在插入和嵌套選擇語句的SQL

[英]SQL using insert and nested select statements where not exists

我正在做一個進行中的摘要,該摘要為老板提供圖表,他想存儲數據,以便圖表可以顯示去年,上季度,上個月和今天的比較。

我有幾個可以很好處理的sql語句,但是我試圖將其合並為一個語句。

SQL:

INSERT INTO `wip_summary` (`wk_num`, `year`, `a_cnt`, `ae_cnt`, `b_cnt`, `sm_cnt`, `xx_cnt`, `tm_cnt`, `svc_cnt`, `ci_cnt`, `a_amt`, `ae_amt`, `b_amt`, `tm_amt`, `sm_amt`, `xx_amt`, `svc_amt`, `ci_amt`)
   SELECT
      WEEK(CURDATE()),
      YEAR(CURDATE()),
      SUM(CASE WHEN `emc` = '0'
                  AND `c_price` >= 10000
                  AND `contractInstall` = '0'
                  AND `terms` <> 'TIME AND MATERIAL'
                  AND `wo_type` <> 'SERVICE ORDER'
          THEN 1 ELSE 0 END) AS `a_cnt`,
      SUM(CASE WHEN `emc` = 1 THEN 1 ELSE 0 END) AS `ae_cnt`,
      SUM(CASE WHEN `emc` = '0'
                  AND `c_price` >= 3500
                  AND `c_price` < 10000
                  AND `contractInstall` = '0'
                  AND `terms` <> 'TIME AND MATERIAL'
                  AND `wo_type` <> 'SERVICE ORDER'
          THEN 1 ELSE 0 END) AS `b_cnt`,
      SUM(CASE WHEN `emc` = '0'
                  AND `c_price` >= 600
                  AND `c_price` < 3500
                  AND `contractInstall` = '0'
                  AND `terms` <> 'TIME AND MATERIAL'
                  AND `wo_type` <> 'SERVICE ORDER'
          THEN 1 ELSE 0 END) AS `sm_cnt`,
      SUM(CASE WHEN `emc` = '0'
                  AND `c_price` < 600
                  AND `contractInstall` = '0'
                  AND `terms` <> 'TIME AND MATERIAL'
                  AND `wo_type` <> 'SERVICE ORDER'
          THEN 1 ELSE 0 END) AS `xx_cnt`,
      SUM(CASE WHEN `emc` = '0'
                  AND `contractInstall` = '0'
                  AND `terms` = 'TIME AND MATERIAL'
                  AND `wo_type` <> 'SERVICE ORDER'
          THEN 1 ELSE 0 END) AS `tm_cnt`,
      SUM(CASE WHEN `emc` = '0'
                  AND `wo_type` = 'SERVICE ORDER'
                  AND `contractInstall` = '0'
          THEN 1 ELSE 0 END) AS `svc_cnt`,
      SUM(CASE WHEN `emc` = '0'
                  AND `contractInstall` = '1'
          THEN 1 ELSE 0 END) AS `ci_cnt`,
      SUM(CASE WHEN `emc` = '0'
                  AND `c_price` >= 10000
                  AND `contractInstall` = '0'
                  AND `terms` <> 'TIME AND MATERIAL'
                  AND `wo_type` <> 'SERVICE ORDER'
          THEN `c_price` ELSE 0 END) AS `a_amt`,
      SUM(CASE WHEN `emc` = 1 THEN `c_price` ELSE 0 END) AS `ae_amt`,
      SUM(CASE WHEN `emc` = '0'
                  AND `c_price` >= 3500
                  AND `c_price` < 10000
                  AND `contractInstall` = '0'
                  AND `terms` <> 'TIME AND MATERIAL'
                  AND `wo_type` <> 'SERVICE ORDER'
          THEN `c_price` ELSE 0 END) AS `b_amt`,
      SUM(CASE WHEN `emc` = '0'
                  AND `contractInstall` = '0'
                  AND `terms` = 'TIME AND MATERIAL'
                  AND `wo_type` <> 'SERVICE ORDER'
          THEN `c_price` ELSE 0 END) AS `tm_amt`,
      SUM(CASE WHEN `emc` = '0'
                  AND `c_price` >= 600
                  AND `c_price` < 3500
                  AND `contractInstall` = '0'
                  AND `terms` <> 'TIME AND MATERIAL'
                  AND `wo_type` <> 'SERVICE ORDER'
          THEN `c_price` ELSE 0 END) AS `sm_amt`,
      SUM(CASE WHEN `emc` = '0'
                  AND `c_price` < 600
                  AND `contractInstall` = '0'
                  AND `terms` <> 'TIME AND MATERIAL'
                  AND `wo_type` <> 'SERVICE ORDER'
          THEN `c_price` ELSE 0 END) AS `xx_amt`,
      SUM(CASE WHEN `emc` = '0'
                  AND `wo_type` = 'SERVICE ORDER'
                  AND `contractInstall` = '0'
          THEN `c_price` ELSE 0 END) AS `svc_amt`,
      SUM(CASE WHEN `emc` = '0'
                  AND `contractInstall` = '1'
          THEN `c_price` ELSE 0 END) AS `ci_amt`
    FROM (SELECT CAST(REPLACE(REPLACE(`contract_price`, ',', ''), '$', '') AS Decimal(10,2)) AS `c_price`,
                 `emc`,
                 `contractInstall`,
                 `wo_type`,
                 `terms`
            FROM `orders`
    WHERE `auth_status` = 'ACTIVE') AS `cp_tbl`
WHERE NOT EXISTS (SELECT 1 FROM `wip_summary` WHERE `wk_num` = WEEK(CURDATE()) AND `year` = YEAR(CURDATE()));

我在做什么分解:

  1. 檢查以查看今年本周的記錄是否在數據庫中
  2. 根據指定條件獲取計數或求和金額

除非表中的星期和年份都很好,否則我會得到一列默認列。

因此,“ WHERE NOT EXISTS存在”是令我失望的原因,但我似乎無法對為什么或如何做出決定。

如果沒有嵌套的SELECT語句,則INSERT ... WHERE NOT EXISTS起作用,而如果沒有INSERT ... WHERE NOT EXISTS語句,則SELECT語句起作用。

用AND替換第二個WHERE。 如果不這樣做,“選擇”將始終產生數據。 如果這樣做,則選擇將不會提供數據,因為wip_summary中已經存在年份/弱組合。

更改此部分:

        FROM `orders`
    WHERE `auth_status` = 'ACTIVE') AS `cp_tbl`
WHERE NOT EXISTS (SELECT 1 FROM `wip_summary` WHERE `wk_num` = WEEK(CURDATE()) AND `year` = YEAR(CURDATE()));

        FROM `orders`
    WHERE `auth_status` = 'ACTIVE') 
    AND NOT EXISTS 
(SELECT 1 FROM `wip_summary` WHERE `wk_num` = WEEK(CURDATE()) AND `year` = YEAR(CURDATE()))
AS `cp_tbl`;

我可以通過添加一個SELECT * FROM ()語句來解決我遇到的復雜問題來解決。

INSERT INTO `wip_summary` (`wk_num`, `year`, `a_cnt`, `ae_cnt`, `b_cnt`, `sm_cnt`, `xx_cnt`, `tm_cnt`, `svc_cnt`, `ci_cnt`, `a_amt`, `ae_amt`, `b_amt`, `tm_amt`, `sm_amt`, `xx_amt`, `svc_amt`, `ci_amt`)
   SELECT * FROM (SELECT
      WEEK(CURDATE()),
      YEAR(CURDATE()),
      SUM(CASE WHEN `emc` = '0' [...]) AS `a_cnt`,
      SUM(CASE WHEN `emc` =  1  [...]) AS `ae_cnt`,
      SUM(CASE WHEN `emc` = '0' [...]) AS `b_cnt`,
      SUM(CASE WHEN `emc` = '0' [...]) AS `sm_cnt`,
      SUM(CASE WHEN `emc` = '0' [...]) AS `xx_cnt`,
      SUM(CASE WHEN `emc` = '0' [...]) AS `tm_cnt`,
      SUM(CASE WHEN `emc` = '0' [...]) AS `svc_cnt`,
      SUM(CASE WHEN `emc` = '0' [...]) AS `ci_cnt`,
      SUM(CASE WHEN `emc` = '0' [...]) AS `a_amt`,
      SUM(CASE WHEN `emc` =  1  [...]) AS `ae_amt`,
      SUM(CASE WHEN `emc` = '0' [...]) AS `b_amt`,
      SUM(CASE WHEN `emc` = '0' [...]) AS `tm_amt`,
      SUM(CASE WHEN `emc` = '0' [...]) AS `sm_amt`,
      SUM(CASE WHEN `emc` = '0' [...]) AS `xx_amt`,
      SUM(CASE WHEN `emc` = '0' [...]) AS `svc_amt`,
      SUM(CASE WHEN `emc` = '0' [...]) AS `ci_amt`
    FROM (SELECT [...] AS `c_price`,
                 `emc`,
                 `contractInstall`,
                 `wo_type`,
                 `terms`
            FROM `orders`
            WHERE `auth_status` = 'ACTIVE') AS `cp_tbl`) AS `vals`
WHERE NOT EXISTS (SELECT 1 FROM `wip_summary` WHERE `wk_num` = WEEK(CURDATE()) AND `year` = YEAR(CURDATE()));

我可能是錯的,但我認為問題在於表示值的SELECT語句與INSERTWHERE子句沖突。

FROM語句中的WHERE沒有沖突,當我刪除它並簡化FROM它仍然可以正常工作(無論是否存在記錄,都插入一行)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM