让我们看看你是否可以解决这个问题,打开物品吧

时间:2017-03-15 21:02:00

标签: mysql sql database

我正在尝试根据以下方案计算Open列。

  1. 对于唯一销售订单+ sales_order_item,如果Billed_Item为NULL,则为Open = Order_Quantity。
  2. 如果Billed_Item不为null,则Open = Order_Quantity - Billed_Quantity直到该唯一的Billed_Quantity之和 sales_order + sales_order_item等于Order_Quantity。一旦 总和(Billed_Quantity为唯一sales_order + sales_order_item)= 对于所有sales_order + sales_order_item,Order_Quantity,然后Open变为= 0。
  3. 作为参考,请查看1209549436,1261171592以获取结果和预期结果表。看看1209549436如何将所有Open标记为0,因为billed_qty = order_quantity的总和但是对于1261171592它是订单 - 因为订单未完成而开票。奇怪的是啊!!

  4. 如果还不够,我必须创建一个视图。

  5. 我的当前查询

    SELECT
    so.sales_order AS 'Sales_Order',
    li.so_item 'Sales_Order_Item',
    li.order_quantity AS 'Order_Quantity',
    IF(bi.bill_item IS NULL, li.order_quantity, li.order_quantity - bi.bill_qty) AS Open,
    li.so_net_price AS 'Sales_Order_Net_Price',
    (li.order_quantity * li.so_net_price) AS 'Sales_Order_Net_Value',
    bi.bill_item AS 'Billed_Item',
    bi.bill_qty AS 'Billed_Quantity',
    bi.bill_doc_date AS 'Billed_Document_Date'
    FROM sap_sales_order so
    LEFT JOIN sap_so_line_item li
    ON so.sales_order = li.sales_order
    LEFT JOIN sap_billing bi
    ON so.sales_order = bi.sales_order
    AND (li.so_item = bi.bill_item or bi.bill_item = 0);
    

    结果

    +-------------+------------------+----------------+-------+-----------------------+-----------------------+-------------+-----------------+----------------------+
    | Sales_Order | Sales_Order_Item | Order_Quantity | Open  | Sales_Order_Net_Price | Sales_Order_Net_Value | Billed_Item | Billed_Quantity | Billed_Document_Date |
    +-------------+------------------+----------------+-------+-----------------------+-----------------------+-------------+-----------------+----------------------+
    | 1209549436  |               10 |           2500 |  1655 |                  1.00 |               2500.00 | 10          |             845 | 2015-11-23           |
    | 1209549436  |               20 |           8800 |     0 |                  1.00 |               8800.00 | 20          |            8800 | 2015-11-23           |
    | 1209549436  |               10 |           2500 |  1450 |                  1.00 |               2500.00 | 10          |            1050 | 2015-12-14           |
    | 1209549436  |               10 |           2500 |  2000 |                  1.00 |               2500.00 | 10          |             500 | 2015-12-21           |
    | 1209549436  |               10 |           2500 |  2395 |                  1.00 |               2500.00 | 10          |             105 | 2015-12-21           |
    | 1261171592  |               10 |           1500 |    70 |                  0.78 |               1170.00 | 10          |            1430 | 2017-02-16           |
    | 1261171581  |               10 |           7698 |  7698 |                  0.78 |               6004.44 | NULL        |            NULL | NULL                 |
    | 1270396732  |               10 |          90000 | 90000 |                  1.00 |              90000.00 | NULL        |            NULL | NULL                 |
    | 1270396732  |               20 |          75000 | 75000 |                  1.00 |              75000.00 | NULL        |            NULL | NULL                 |
    | 1270396732  |               30 |              1 |     1 |             145000.00 |             145000.00 | NULL        |            NULL | NULL                 |
    | 1270396732  |               40 |              1 |     1 |              60000.00 |              60000.00 | NULL        |            NULL | NULL                 |
    +-------------+------------------+----------------+-------+-----------------------+-----------------------+-------------+-----------------+----------------------+
    

    预期结果(检查打开列)

    +-------------+------------------+----------------+-------+-----------------------+-----------------------+-------------+-----------------+----------------------+
    | Sales_Order | Sales_Order_Item | Order_Quantity | Open  | Sales_Order_Net_Price | Sales_Order_Net_Value | Billed_Item | Billed_Quantity | Billed_Document_Date |
    +-------------+------------------+----------------+-------+-----------------------+-----------------------+-------------+-----------------+----------------------+
    | 1209549436  |               10 |           2500 |     0 |                  1.00 |               2500.00 | 10          |             845 | 2015-11-23           |
    | 1209549436  |               20 |           8800 |     0 |                  1.00 |               8800.00 | 20          |            8800 | 2015-11-23           |
    | 1209549436  |               10 |           2500 |     0 |                  1.00 |               2500.00 | 10          |            1050 | 2015-12-14           |
    | 1209549436  |               10 |           2500 |     0 |                  1.00 |               2500.00 | 10          |             500 | 2015-12-21           |
    | 1209549436  |               10 |           2500 |     0 |                  1.00 |               2500.00 | 10          |             105 | 2015-12-21           |
    | 1261171592  |               10 |           1500 |    70 |                  0.78 |               1170.00 | 10          |            1430 | 2017-02-16           |
    | 1261171581  |               10 |           7698 |  7698 |                  0.78 |               6004.44 | NULL        |            NULL | NULL                 |
    | 1270396732  |               10 |          90000 | 90000 |                  1.00 |              90000.00 | NULL        |            NULL | NULL                 |
    | 1270396732  |               20 |          75000 | 75000 |                  1.00 |              75000.00 | NULL        |            NULL | NULL                 |
    | 1270396732  |               30 |              1 |     1 |             145000.00 |             145000.00 | NULL        |            NULL | NULL                 |
    | 1270396732  |               40 |              1 |     1 |              60000.00 |              60000.00 | NULL        |            NULL | NULL                 |
    +-------------+------------------+----------------+-------+-----------------------+-----------------------+-------------+-----------------+----------------------+
    

    SQL结构

    CREATE TABLE `sap_sales_order` (
      `sales_order` char(15) NOT NULL,
      `order_reason` varchar(150) DEFAULT NULL,
      `so_create_on` date DEFAULT NULL,
      `sold_to_party` char(15) DEFAULT NULL,
      `customer_po` varchar(150) DEFAULT NULL,
      `site_id_name_1` varchar(150) DEFAULT NULL,
      `import_date` date DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    
    INSERT INTO `sap_sales_order` (`sales_order`, `order_reason`, `so_create_on`, `sold_to_party`, `customer_po`, `site_id_name_1`, `import_date`) VALUES
    ('1270396732', NULL, '2017-02-02', 'A1', NULL, 'GHI', '2017-03-13'),
    ('1261171592', NULL, '2016-12-15', 'A1', NULL, 'GHI', '2017-03-13'),
    ('1209549436', NULL, '2015-09-23', '45342', 'PPQQRR', 'DEF', '2017-03-13'),
    ('1261171581', NULL, '2016-12-15', '45342', 'OMI1212', 'DEF', '2017-03-13');
    
    CREATE TABLE `sap_so_line_item` (
      `so_item` int(10) UNSIGNED NOT NULL,
      `material` varchar(45) CHARACTER SET latin1 DEFAULT NULL,
      `description` varchar(150) CHARACTER SET latin1 DEFAULT NULL,
      `order_quantity` int(10) UNSIGNED DEFAULT NULL,
      `so_net_price` decimal(11,2) DEFAULT NULL,
      `so_net_value` decimal(11,2) DEFAULT NULL,
      `sales_order` char(15) CHARACTER SET latin1 NOT NULL,
      `import_date` date NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    
    INSERT INTO `sap_so_line_item` (`so_item`, `material`, `description`, `order_quantity`, `so_net_price`, `so_net_value`, `sales_order`, `import_date`) VALUES
    ~(10, 'M1', 'K1', 7698, '0.78', '6006.44', '1261171581', '2017-03-13'),
    ~(10, 'M4', 'K4', 2500, '1.00', '2500.00', '1209549436', '2017-03-13'),
    ~(10, 'M4', 'K4', 90000, '1.00', '90000.00', '1270396732', '2017-03-13'),
    ~(20, 'M3', 'K3', 75000, '1.00', '75000.00', '1270396732', '2017-03-13'),
    ~(30, 'M4', 'K4', 1, '145000.00', '145000.00', '1270396732', '2017-03-13'),
    ~(40, 'M1', 'K1', 1, '60000.00', '60000.00', '1270396732', '2017-03-13'),
    ~(20, 'M2', 'K2', 8800, '1.00', '8800.00', '1209549436', '2017-03-13'),
    (10, 'M5', 'K5', 1500, '0.78', '1170.00', '1261171592', '2017-03-13');
    
    CREATE TABLE `sap_billing` (
      `bill_item` char(15) NOT NULL,
      `bill_qty` int(10) UNSIGNED DEFAULT NULL,
      `bill_doc_date` date DEFAULT NULL,
      `bill_doc` char(15) NOT NULL,
      `bill_net_value` decimal(11,2) DEFAULT NULL,
      `sales_order` char(15) NOT NULL,
      `import_date` date NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    
    INSERT INTO `sap_billing` (`bill_item`, `bill_qty`, `bill_doc_date`, `bill_doc`, `bill_net_value`, `sales_order`, `import_date`) VALUES
    ('10', 845, '2015-11-23', '3206790137', '845.00', '1209549436', '2017-03-13'),
    ('20', 8800, '2015-11-23', '3206790137', '8800.00', '1209549436', '2017-03-13'),
    ('10', 1050, '2015-12-14', '3209056079', '1050.00', '1209549436', '2017-03-13'),
    ('10', 500, '2015-12-21', '3209763880', '500.00', '1209549436', '2017-03-13'),
    ('10', 105, '2015-12-21', '3209763885', '105.00', '1209549436', '2017-03-13'),
    ('10', 1430, '2017-02-16', '3251725740', '1154.40', '1261171592', '2017-03-13');
    

2 个答案:

答案 0 :(得分:1)

您的if语句对于您尝试执行的操作不正确:

IF(bi.bill_item IS NULL,li.order_quantity,li.order_quantity - bi.bill_qty)

这意味着: 如果bill_item为null - 设置为order_quantity 否则设置为order_quantity - bill_qty

您需要一个子选择语句来评估跨越具有相同order_num的所有行的当前行的bill_qty的总和。

例如:

select
li.order_quantity - 
(select(sum(innerli.bill_qty) FROM sap_sales_order innerso
LEFT JOIN sap_so_line_item innerli
ON innerso.sales_order = innerli.sales_order
LEFT JOIN sap_billing innerbi
ON innerso.sales_order = innerbi.sales_order
AND (innerli.so_item = innerbi.bill_item or innerbi.bill_item = 0) 
and innerso.sales_order = so.sales_order)  //IMPORTANT LINE TO TIE THE SUB SELECT TO THE MAIN

FROM sap_sales_order so
LEFT JOIN sap_so_line_item li
ON so.sales_order = li.sales_order
LEFT JOIN sap_billing bi
ON so.sales_order = bi.sales_order
AND (li.so_item = bi.bill_item or bi.bill_item = 0);

答案 1 :(得分:1)

将加入当前查询的派生表与按 Sales_Order Sales_Order_Item 分组的聚合查询一起考虑。然后在外部查询中再次运行条件IF逻辑以计算打开

SELECT unit.Sales_Order, unit.Sales_Order_Item, unit.Order_Quantity, 
       IF(unit.Order_Quantity = agg.Sum_Bill_Quantity, 0, unit.Open) AS 'Open', 
       unit.Sales_Order_Net_Price, unit.Sales_Order_Net_Value, unit.Billed_Item, 
       unit.Billed_Quantity, unit.Billed_Document_Date
FROM

    (SELECT so.sales_order AS 'Sales_Order',
            li.so_item AS 'Sales_Order_Item',
            li.order_quantity AS 'Order_Quantity',
            IF(bi.bill_item IS NULL, li.order_quantity,
            li.order_quantity - bi.bill_qty) AS Open,
            li.so_net_price AS 'Sales_Order_Net_Price',
            (li.order_quantity * li.so_net_price) AS 'Sales_Order_Net_Value',
            bi.bill_item AS 'Billed_Item',
            bi.bill_qty AS 'Billed_Quantity',
            bi.bill_doc_date AS 'Billed_Document_Date'
    FROM sap_sales_order so
    LEFT JOIN sap_so_line_item li
    ON so.sales_order = li.sales_order
    LEFT JOIN sap_billing bi
    ON so.sales_order = bi.sales_order
    AND (li.so_item = bi.bill_item or bi.bill_item = 0)
   ) As unit

INNER JOIN

   (SELECT so.sales_order AS 'Sales_Order', 
           li.so_item AS 'Sales_Order_Item', 
           SUM(bi.bill_qty) AS Sum_Bill_Quantity 
    FROM sap_sales_order so
    LEFT JOIN sap_so_line_item li
    ON so.sales_order = li.sales_order
    LEFT JOIN sap_billing bi
    ON so.sales_order = bi.sales_order
    AND (li.so_item = bi.bill_item or bi.bill_item = 0)
    GROUP BY so.sales_order, 
             li.so_item
   ) As agg

ON unit.Sales_Order = agg.Sales_Order 
AND unit.Sales_Order_Item = agg.Sales_Order_Item
ORDER BY unit.Sales_Order, unit.Sales_Order_Item;

要创建视图,请使用CREATE VIEW view_name AS select_statement