I want to simple query that give me stock day by day details.
I wrote this code:
SELECT
TRNDATE, I_NAME,
SUM(AMOUNT) AS OPENING, SUM(PURCHASE) AS PURCHASE,
SUM(SALE) AS SALE, SUM(AMOUNT) SUM(PURCHASE) - SUM(SALE) AS STOCK
FROM
(SELECT
TRNDATE, I_NAME, AMOUNT AS OPENING, 0 AS PURCHASE,
0 AS SALE, 0 AS STOCK
FROM DBO.ITEMMAST
UNION ALL
SELECT
TRNDATE, I_NAME, 0 AS OPENING, AMOUNT AS PURCHASE,
0 AS SALE, 0 AS STOCK
FROM DBO.PURCHASE
UNION ALL
SELECT
TRNDATE, I_NAME, 0 AS OPENING, 0 AS PURCHASE,
AMOUNT AS SALE,0 AS STOCK
FROM DBO.SALE) MAIN
GROUP BY
TRNDATE, I_NAME
Output is
| Item | Date | opening | Purchase | Sale | Stock |
|---|---|---|---|---|---|
| Gold | 10/01/2022 | 10 | 0 | 0 | 10 |
| Gold | 11/01/2022 | 0 | 5 | 2 | 3 |
| Gold | 12/01/2022 | 0 | 0 | 2 | -2 |
The result returns only same line summary
I want to be like this
| Item | Date | opening | Purchase | Sale | Stock |
|---|---|---|---|---|---|
| Gold | 10/01/2022 | 10 | 0 | 0 | 10 |
| Gold | 11/01/2022 | 0 | 5 | 2 | 13 |
| Gold | 12/01/2022 | 0 | 0 | 2 | 11 |
I need to get line by line summary.
CodePudding user response:
I suspect this is what you are after, however, it is impossible to test. What you want is a cumulative SUM, which is the one at the end with the OVER clause. As a result you need to use another derived table.
I prefer to use CTEs over subqueries, as they are reusable through the query, so I change your query to use those and end up with the following:
WITH Items AS(
SELECT TRNDATE,
I_NAME,
AMOUNT AS OPENING,
0 AS PURCHASE,
0 AS SALE,
0 AS STOCK
FROM dbo.ITEMMAST
UNION ALL
SELECT TRNDATE,
I_NAME,
0 AS OPENING,
AMOUNT AS PURCHASE,
0 AS SALE,
0 AS STOCK
FROM dbo.PURCHASE
UNION ALL
SELECT TRNDATE,
I_NAME,
0 AS OPENING,
0 AS PURCHASE,
AMOUNT AS SALE,
0 AS STOCK
FROM dbo.SALE),
Aggregrates AS(
SELECT TRNDATE,
I_NAME,
SUM(OPENING) AS OPENING, --Note you had SUM(AMOUNT) in your original attempt
SUM(PURCHASE) AS PURCHASE,
SUM(SALE) AS SALE
FROM Items
GROUP BY TRNDATE,
I_NAME)
SELECT TRNDATE,
I_NAME,
OPENING,
PURCHASE,
SALE,
SUM(OPENING PURCHASE - SALE) OVER (PARTITION BY I_NAME ORDER BY TRNDATE
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS STOCK
FROM Aggregrates;
