Mysql – Calculating open items while accounting for what has already been billed

MySQL

Can you guys help me to go in right direction. I want to calculate open items while accounting for already billed items.

Open column = Ordered quantity – billed quantity but if some part of that original order has already been billed then that needs to be deducted too.

My query

SELECT 
so.so_create_on AS 'Sales_Order_Created_On',
so.sales_order AS 'Sales_Order',
li.so_item 'Sales_Order_Item',
so.site_id_name_1 'Site_ID_Name_1',
li.order_quantity AS 'Order_Quantity',
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',
(bi.bill_qty * li.so_net_price) AS 'Billed Net Value' 
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)

Query result

+------------------------+-------------+------------------+----------------+----------------+-----------------------+-----------------------+-------------+-----------------+----------------------+------------------+
| Sales_Order_Created_On | Sales_Order | Sales_Order_Item | Site_ID_Name_1 | Order_Quantity | Sales_Order_Net_Price | Sales_Order Net Value | Billed_Item | Billed_Quantity | Billed_Document_Date | Billed Net Value |
+------------------------+-------------+------------------+----------------+----------------+-----------------------+-----------------------+-------------+-----------------+----------------------+------------------+
| 2015-09-23             | 1209549436  |               10 | DEF            |           2500 |                  1.00 |               2500.00 | 10          |             845 | 2015-11-23           |           845.00 |
| 2015-09-23             | 1209549436  |               20 | DEF            |           8800 |                  1.00 |               8800.00 | 20          |            8800 | 2015-11-23           |          8800.00 |
| 2015-09-23             | 1209549436  |               10 | DEF            |           2500 |                  1.00 |               2500.00 | 10          |            1050 | 2015-12-14           |          1050.00 |
| 2015-09-23             | 1209549436  |               10 | DEF            |           2500 |                  1.00 |               2500.00 | 10          |             500 | 2015-12-21           |           500.00 |
| 2015-09-23             | 1209549436  |               10 | DEF            |           2500 |                  1.00 |               2500.00 | 10          |             105 | 2015-12-21           |           105.00 |
| 2016-04-28             | 1230503910  |               10 | DEF            |           9500 |                  1.00 |               9500.00 | 10          |            1000 | 2016-07-18           |          1000.00 |
| 2016-04-28             | 1230503910  |               10 | DEF            |           9500 |                  1.00 |               9500.00 | 10          |            3775 | 2016-07-29           |          3775.00 |
| 2016-04-28             | 1230503910  |               10 | DEF            |           9500 |                  1.00 |               9500.00 | 10          |            2500 | 2016-07-29           |          2500.00 |
| 2016-04-28             | 1230503910  |               10 | DEF            |           9500 |                  1.00 |               9500.00 | 10          |            2225 | 2016-10-19           |          2225.00 |
| 2017-02-03             | 1270633456  |               10 | ABC            |              1 |              50000.00 |              50000.00 | 10          |               1 | 2017-02-08           |         50000.00 |
| 2017-02-03             | 1270633456  |               20 | ABC            |              1 |             145000.00 |             145000.00 | 20          |               1 | 2017-02-08           |        145000.00 |
| 2016-07-28             | 111831121   |               10 | GHI            |             20 |                  0.75 |                 15.00 | 10          |              20 | 2016-07-29           |            15.00 |
| 2016-07-28             | 0111831121  |               20 | GHI            |             50 |                  0.75 |                 37.50 | 20          |              50 | 2016-07-29           |            37.50 |
| 2017-02-03             | 1270633456  |               10 | ABC            |              1 |              50000.00 |              50000.00 | 0           |               0 | NULL                 |             0.00 |
| 2017-02-03             | 1270633456  |               20 | ABC            |              1 |             145000.00 |             145000.00 | 0           |               0 | NULL                 |             0.00 |
| 2017-02-03             | 1270633456  |               30 | ABC            |             15 |               2200.00 |              33000.00 | 0           |               0 | NULL                 |             0.00 |
| 2017-02-03             | 1270633456  |               40 | ABC            |          25000 |                  1.00 |              25000.00 | 0           |               0 | NULL                 |             0.00 |
| 2017-02-28             | 1275536210  |               10 | DEF            |           1000 |                  1.00 |               1000.00 | 0           |               0 | NULL                 |             0.00 |
| 2017-02-28             | 1275536210  |               20 | DEF            |           1450 |                  1.00 |               1450.00 | 0           |               0 | NULL                 |             0.00 |
| 2017-02-28             | 1275536210  |               30 | DEF            |            145 |                  1.00 |                145.00 | 0           |               0 | NULL                 |             0.00 |
| 2017-02-28             | 1275536210  |               40 | DEF            |            880 |                  1.00 |                880.00 | 0           |               0 | NULL                 |             0.00 |
+------------------------+-------------+------------------+----------------+----------------+-----------------------+-----------------------+-------------+-----------------+----------------------+------------------+

What I want (Open column added)

+------+------------------------+-------------+------------------+----------------+----------------+-----------------------+-----------------------+-------------+-----------------+----------------------+------------------+
    | Open | Sales_Order_Created_On | Sales_Order | Sales_Order_Item | Site_ID_Name_1 | Order_Quantity | Sales_Order_Net_Price | Sales_Order Net Value | Billed_Item | Billed_Quantity | Billed_Document_Date | Billed Net Value |
    +------+------------------------+-------------+------------------+----------------+----------------+-----------------------+-----------------------+-------------+-----------------+----------------------+------------------+
    | 1655 | 2015-09-23             | 1209549436  |               10 | DEF            |           2500 |                  1.00 |               2500.00 | 10          |             845 | 2015-11-23           |           845.00 |
    |    0 | 2015-09-23             | 1209549436  |               20 | DEF            |           8800 |                  1.00 |               8800.00 | 20          |            8800 | 2015-11-23           |          8800.00 |
    |  605 | 2015-09-23             | 1209549436  |               10 | DEF            |           2500 |                  1.00 |               2500.00 | 10          |            1050 | 2015-12-14           |          1050.00 |
    |  105 | 2015-09-23             | 1209549436  |               10 | DEF            |           2500 |                  1.00 |               2500.00 | 10          |             500 | 2015-12-21           |           500.00 |
    |    0 | 2015-09-23             | 1209549436  |               10 | DEF            |           2500 |                  1.00 |               2500.00 | 10          |             105 | 2015-12-21           |           105.00 |
    | 8500 | 2016-04-28             | 1230503910  |               10 | DEF            |           9500 |                  1.00 |               9500.00 | 10          |            1000 | 2016-07-18           |          1000.00 |
    | 4725 | 2016-04-28             | 1230503910  |               10 | DEF            |           9500 |                  1.00 |               9500.00 | 10          |            3775 | 2016-07-29           |          3775.00 |
    | 2225 | 2016-04-28             | 1230503910  |               10 | DEF            |           9500 |                  1.00 |               9500.00 | 10          |            2500 | 2016-07-29           |          2500.00 |
    |    0 | 2016-04-28             | 1230503910  |               10 | DEF            |           9500 |                  1.00 |               9500.00 | 10          |            2225 | 2016-10-19           |          2225.00 |
    |    0 | 2017-02-03             | 1270633456  |               10 | ABC            |              1 |              50000.00 |              50000.00 | 10          |               1 | 2017-02-08           |         50000.00 |
    |    0 | 2017-02-03             | 1270633456  |               20 | ABC            |              1 |             145000.00 |             145000.00 | 20          |               1 | 2017-02-08           |        145000.00 |
    |    0 | 2016-07-28             | 111831121   |               10 | GHI            |             20 |                  0.75 |                 15.00 | 10          |              20 | 2016-07-29           |            15.00 |
    |    0 | 2016-07-28             | 0111831121  |               20 | GHI            |             50 |                  0.75 |                 37.50 | 20          |              50 | 2016-07-29           |            37.50 |
    |    1 | 2017-02-03             | 1270633456  |               10 | ABC            |              1 |              50000.00 |              50000.00 | 0           |               0 | NULL                 |             0.00 |
    |    1 | 2017-02-03             | 1270633456  |               20 | ABC            |              1 |             145000.00 |             145000.00 | 0           |               0 | NULL                 |             0.00 |
    |   15 | 2017-02-03             | 1270633456  |               30 | ABC            |             15 |               2200.00 |              33000.00 | 0           |               0 | NULL                 |             0.00 |
    |25000 | 2017-02-03             | 1270633456  |               40 | ABC            |          25000 |                  1.00 |              25000.00 | 0           |               0 | NULL                 |             0.00 |
    | 1000 | 2017-02-28             | 1275536210  |               10 | DEF            |           1000 |                  1.00 |               1000.00 | 0           |               0 | NULL                 |             0.00 |
    | 1450 | 2017-02-28             | 1275536210  |               20 | DEF            |           1450 |                  1.00 |               1450.00 | 0           |               0 | NULL                 |             0.00 |
    |  145 | 2017-02-28             | 1275536210  |               30 | DEF            |            145 |                  1.00 |                145.00 | 0           |               0 | NULL                 |             0.00 |
    |  880 | 2017-02-28             | 1275536210  |               40 | DEF            |            880 |                  1.00 |                880.00 | 0           |               0 | NULL                 |             0.00 |
    +------+------------------------+-------------+------------------+----------------+----------------+-----------------------+-----------------------+-------------+-----------------+----------------------+------------------+

SQL Structure

--
-- Table structure for table `sap_billing`
--

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;

--
-- Dumping data for table `sap_billing`
--

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', 1000, '2016-07-18', '3230230297', '1000.00', '1230503910', '2017-03-13'),
('10', 3775, '2016-07-29', '3231648901', '3775.00', '1230503910', '2017-03-13'),
('10', 2500, '2016-07-29', '3231648902', '2500.00', '1230503910', '2017-03-13'),
('10', 2225, '2016-10-19', '3240098774', '2225.00', '1230503910', '2017-03-13'),
('10', 1, '2017-02-08', '3250923886', '50000.00', '1270633456', '2017-03-13'),
('20', 1, '2017-02-08', '3250923886', '145000.00', '1270633456', '2017-03-13'),
('10', 20, '2016-07-29', '5021718928', '15.00', '111831121', '2017-03-13'),
('20', 50, '2016-07-29', '5021718928', '37.50', '0111831121', '2017-03-13'),
('0', 0, NULL, 'NA', '0.00', '1270633456', '2017-03-13'),
('0', 0, NULL, 'NA', '0.00', '1275536210', '2017-03-13');

-- --------------------------------------------------------

--
-- Table structure for table `sap_sales_order`
--

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;

--
-- Dumping data for table `sap_sales_order`
--

INSERT INTO `sap_sales_order` (`sales_order`, `order_reason`, `so_create_on`, `sold_to_party`, `customer_po`, `site_id_name_1`, `import_date`) VALUES
('0111831121', NULL, '2016-07-28', 'A1', NULL, 'GHI', '2017-03-13'),
('111831121', NULL, '2016-07-28', 'A1', NULL, 'GHI', '2017-03-13'),
('1209549436', NULL, '2015-09-23', '45342', 'PPQQRR', 'DEF', '2017-03-13'),
('1230503910', NULL, '2016-04-28', '45342', 'OMI1212', 'DEF', '2017-03-13'),
('1270633456', NULL, '2017-02-03', 'AV', '123456', 'ABC', '2017-03-13'),
('1275536210', NULL, '2017-02-28', '45342', '1A', 'DEF', '2017-03-13');

-- --------------------------------------------------------

--
-- Table structure for table `sap_so_line_item`
--

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;

--
-- Dumping data for table `sap_so_line_item`
--

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', 20, '0.75', '15.00', '111831121', '2017-03-13'),
(10, 'M4', 'K4', 2500, '1.00', '2500.00', '1209549436', '2017-03-13'),
(10, 'M4', 'K4', 9500, '1.00', '9500.00', '1230503910', '2017-03-13'),
(10, 'M3', 'K3', 1, '50000.00', '50000.00', '1270633456', '2017-03-13'),
(10, 'M4', 'K4', 1000, '1.00', '1000.00', '1275536210', '2017-03-13'),
(20, 'M1', 'K1', 50, '0.75', '37.50', '0111831121', '2017-03-13'),
(20, 'M2', 'K2', 8800, '1.00', '8800.00', '1209549436', '2017-03-13'),
(20, 'M5', 'K5', 1, '145000.00', '145000.00', '1270633456', '2017-03-13'),
(20, 'M4', 'K4', 1450, '1.00', '1450.00', '1275536210', '2017-03-13'),
(30, 'M6', 'K6', 15, '2200.00', '33000.00', '1270633456', '2017-03-13'),
(30, 'M4', 'K4', 145, '1.00', '145.00', '1275536210', '2017-03-13'),
(40, 'M7', 'K7', 25000, '1.00', '25000.00', '1270633456', '2017-03-13'),
(40, 'M4', 'K4', 880, '1.00', '880.00', '1275536210', '2017-03-13');

-- --------------------------------------------------------

Best Answer

Use variables to maintain accumulates.

The aim of this command, is to reset @acm when Sales_Order or Sales_Order_Item changes, otherwise subtract billed quantity from accumulate.

To get the result I should order records by Sales_Order, Sales_Order_Item, Billed_Document_Date.

Check it here: http://rextester.com/GUFP22305

SELECT    IF(@last_order <> Sales_Order OR @last_item <> Sales_Order_Item, @acm := Balance_Qty, 
             IF(Balance_Qty > 0, @acm := @acm - Billed_Quantity, @acm := @acm)) AS 'Open',
          Sales_Order_Created_On,
          @last_order := Sales_Order as 'Sales_Order',
          @last_item := Sales_Order_Item AS 'Sales_Order_Item',
          Site_ID_Name_1,
          Order_Quantity,
          Sales_Order_Net_Price,
          'Sales_Order Net Value',
          Billed_Item,
          Billed_Quantity,
          Billed_Document_Date,
          'Billed Net Value'
FROM      (SELECT @acm := 0, @last_order := '', @last_item := '') x,
          (SELECT    so.so_create_on AS 'Sales_Order_Created_On',
                     so.sales_order AS 'Sales_Order',
                     li.so_item 'Sales_Order_Item',
                     so.site_id_name_1 'Site_ID_Name_1',
                     li.order_quantity AS 'Order_Quantity',
                     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',
                     (bi.bill_qty * li.so_net_price) AS 'Billed Net Value',
                     (li.order_quantity - bi.bill_qty) AS 'Balance_Qty'
           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)
           ORDER BY  so.sales_order, li.so_item, bi.bill_doc_date) y
;

This is the result:

+-------+------------------------+-------------+------------------+----------------+----------------+-----------------------+-----------------------+-------------+-----------------+----------------------+------------------+
| Open  | Sales_Order_Created_On | Sales_Order | Sales_Order_Item | Site_ID_Name_1 | Order_Quantity | Sales_Order_Net_Price | Sales_Order Net Value | Billed_Item | Billed_Quantity | Billed_Document_Date | Billed Net Value |
+-------+------------------------+-------------+------------------+----------------+----------------+-----------------------+-----------------------+-------------+-----------------+----------------------+------------------+
| 0     | 28.07.2016 00:00:00    | 0111831121  | 20               | GHI            | 50             | 0,75                  | Sales_Order Net Value | 20          | 50              | 29.07.2016 00:00:00  | Billed Net Value |
| 0     | 28.07.2016 00:00:00    | 111831121   | 10               | GHI            | 20             | 0,75                  | Sales_Order Net Value | 10          | 20              | 29.07.2016 00:00:00  | Billed Net Value |
+-------+------------------------+-------------+------------------+----------------+----------------+-----------------------+-----------------------+-------------+-----------------+----------------------+------------------+
| 1655  | 23.09.2015 00:00:00    | 1209549436  | 10               | DEF            | 2500           | 1,00                  | Sales_Order Net Value | 10          | 845             | 23.11.2015 00:00:00  | Billed Net Value |
| 605   | 23.09.2015 00:00:00    | 1209549436  | 10               | DEF            | 2500           | 1,00                  | Sales_Order Net Value | 10          | 1050            | 14.12.2015 00:00:00  | Billed Net Value |
| 105   | 23.09.2015 00:00:00    | 1209549436  | 10               | DEF            | 2500           | 1,00                  | Sales_Order Net Value | 10          | 500             | 21.12.2015 00:00:00  | Billed Net Value |
| 0     | 23.09.2015 00:00:00    | 1209549436  | 10               | DEF            | 2500           | 1,00                  | Sales_Order Net Value | 10          | 105             | 21.12.2015 00:00:00  | Billed Net Value |
+-------+------------------------+-------------+------------------+----------------+----------------+-----------------------+-----------------------+-------------+-----------------+----------------------+------------------+
| 0     | 23.09.2015 00:00:00    | 1209549436  | 20               | DEF            | 8800           | 1,00                  | Sales_Order Net Value | 20          | 8800            | 23.11.2015 00:00:00  | Billed Net Value |
+-------+------------------------+-------------+------------------+----------------+----------------+-----------------------+-----------------------+-------------+-----------------+----------------------+------------------+
| 8500  | 28.04.2016 00:00:00    | 1230503910  | 10               | DEF            | 9500           | 1,00                  | Sales_Order Net Value | 10          | 1000            | 18.07.2016 00:00:00  | Billed Net Value |
| 4725  | 28.04.2016 00:00:00    | 1230503910  | 10               | DEF            | 9500           | 1,00                  | Sales_Order Net Value | 10          | 3775            | 29.07.2016 00:00:00  | Billed Net Value |
| 2225  | 28.04.2016 00:00:00    | 1230503910  | 10               | DEF            | 9500           | 1,00                  | Sales_Order Net Value | 10          | 2500            | 29.07.2016 00:00:00  | Billed Net Value |
| 0     | 28.04.2016 00:00:00    | 1230503910  | 10               | DEF            | 9500           | 1,00                  | Sales_Order Net Value | 10          | 2225            | 19.10.2016 00:00:00  | Billed Net Value |
+-------+------------------------+-------------+------------------+----------------+----------------+-----------------------+-----------------------+-------------+-----------------+----------------------+------------------+
| 1     | 03.02.2017 00:00:00    | 1270633456  | 10               | ABC            | 1              | 50000,00              | Sales_Order Net Value | 0           | 0               | NULL                 | Billed Net Value |
| 1     | 03.02.2017 00:00:00    | 1270633456  | 10               | ABC            | 1              | 50000,00              | Sales_Order Net Value | 10          | 1               | 08.02.2017 00:00:00  | Billed Net Value |
+-------+------------------------+-------------+------------------+----------------+----------------+-----------------------+-----------------------+-------------+-----------------+----------------------+------------------+
| 1     | 03.02.2017 00:00:00    | 1270633456  | 20               | ABC            | 1              | 145000,00             | Sales_Order Net Value | 0           | 0               | NULL                 | Billed Net Value |
| 1     | 03.02.2017 00:00:00    | 1270633456  | 20               | ABC            | 1              | 145000,00             | Sales_Order Net Value | 20          | 1               | 08.02.2017 00:00:00  | Billed Net Value |
+-------+------------------------+-------------+------------------+----------------+----------------+-----------------------+-----------------------+-------------+-----------------+----------------------+------------------+
| 15    | 03.02.2017 00:00:00    | 1270633456  | 30               | ABC            | 15             | 2200,00               | Sales_Order Net Value | 0           | 0               | NULL                 | Billed Net Value |
+-------+------------------------+-------------+------------------+----------------+----------------+-----------------------+-----------------------+-------------+-----------------+----------------------+------------------+
| 25000 | 03.02.2017 00:00:00    | 1270633456  | 40               | ABC            | 25000          | 1,00                  | Sales_Order Net Value | 0           | 0               | NULL                 | Billed Net Value |
+-------+------------------------+-------------+------------------+----------------+----------------+-----------------------+-----------------------+-------------+-----------------+----------------------+------------------+
| 1000  | 28.02.2017 00:00:00    | 1275536210  | 10               | DEF            | 1000           | 1,00                  | Sales_Order Net Value | 0           | 0               | NULL                 | Billed Net Value |
+-------+------------------------+-------------+------------------+----------------+----------------+-----------------------+-----------------------+-------------+-----------------+----------------------+------------------+
| 1450  | 28.02.2017 00:00:00    | 1275536210  | 20               | DEF            | 1450           | 1,00                  | Sales_Order Net Value | 0           | 0               | NULL                 | Billed Net Value |
+-------+------------------------+-------------+------------------+----------------+----------------+-----------------------+-----------------------+-------------+-----------------+----------------------+------------------+
| 145   | 28.02.2017 00:00:00    | 1275536210  | 30               | DEF            | 145            | 1,00                  | Sales_Order Net Value | 0           | 0               | NULL                 | Billed Net Value |
+-------+------------------------+-------------+------------------+----------------+----------------+-----------------------+-----------------------+-------------+-----------------+----------------------+------------------+
| 880   | 28.02.2017 00:00:00    | 1275536210  | 40               | DEF            | 880            | 1,00                  | Sales_Order Net Value | 0           | 0               | NULL                 | Billed Net Value |
+-------+------------------------+-------------+------------------+----------------+----------------+-----------------------+-----------------------+-------------+-----------------+----------------------+------------------+