我正在尝试根据以下方案计算Open列。
作为参考,请查看1209549436,1261171592以获取结果和预期结果表。看看1209549436如何将所有Open标记为0,因为billed_qty = order_quantity的总和但是对于1261171592它是订单 - 因为订单未完成而开票。奇怪的是啊!!
如果还不够,我必须创建一个视图。
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 |
+-------------+------------------+----------------+-------+-----------------------+-----------------------+-------------+-----------------+----------------------+
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');
答案 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;