/* Sales */
CREATE TABLE sales (
    id int auto_increment primary key,
    time_stamp DATE,
    product VARCHAR(255),
    sales_quantity INT
);
INSERT INTO sales
(time_stamp, product, sales_quantity)
VALUES 
("2020-01-14", "Product_A", "100"),
("2020-01-14", "Product_B", "300"),
("2020-01-15", "Product_B", "100"),
("2020-01-15", "Product_C", "350"),
("2020-01-16", "Product_B", "130"),
("2020-01-16", "Product_C", "350"),
("2020-01-16", "Product_D", "670"),
("2020-01-17", "Product_C", "130"),
("2020-01-17", "Product_D", "980"),
("2020-01-17", "Product_E", "700"),
("2020-01-17", "Product_F", "450");
/* Products */
CREATE TABLE products (
    id int auto_increment primary key,
    product VARCHAR(255)
);
INSERT INTO products 
(product)
VALUES 
("Product_B"),
("Product_D");
Expected Result:
time_stamp difference 2020-01-15 -200 = (100)-(200) 2020-01-16 700 = (130+670) - (100) 2020-01-17 180 = (980) - (130+670)
I want to calculate the difference of the sales_quantity of different timestamps of products that are also existing in the table products.
Therefore, I created this query:
WITH cte AS (SELECT
             product
             FROM products
             GROUP BY 1)
SELECT
MAX(t1.time_stamp_02),
(SUM(t1.sales_quantity_02) - SUM(t1.sales_quantity_01)) AS difference
FROM
  (SELECT
  time_stamp AS time_stamp_01,
  0 AS time_stamp_02,
  SUM(sales_quantity) AS sales_quantity_01,
  0 AS sales_quantity_02
  FROM sales
  WHERE time_stamp BETWEEN '2020-01-14' AND '2020-01-14'
  AND product IN (SELECT product FROM cte)
  UNION ALL
  SELECT
  0 AS time_stamp_01,
  time_stamp AS time_stamp_02,
  0 AS sales_quantity_01,
  SUM(sales_quantity) AS sales_quantity_02
  FROM sales
  WHERE time_stamp BETWEEN '2020-01-15' AND '2020-01-15'
  AND product IN (SELECT product FROM cte)) t1
The query itself works but my issue is that I can only query two timestamps separately.
Therefore, I am wondering if there is a solution that iterates through all the timestamps and gives me the expected result?
Advertisement
Answer
You can try the below – DEMO
select * from ( select time_stamp,totalq-lag(totalq) over(order by time_stamp) as val from ( select time_stamp,sum(sales_quantity) as totalq from products p join sales s on p.product=s.product group by time_stamp )A)final where val is not null