I tried to SUM values of multiple columns (CASH CARD CHEQUE REST) and group them to display totals for each day.
Actual table:
Date | CASH | CARD | CHEQUE | REST | TYPE |
---|---|---|---|---|---|
2022-06-02 | 150.00 | 200.00 | 0.00 | 12.00 | STORE1 |
2022-06-02 | 150.00 | 240.00 | 56.00 | 67.00 | STORE2 |
2022-06-02 | 45.00 | 459.00 | 150.00 | 0.00 | STORE3 |
2022-06-02 | 45.00 | 400.00 | 150.00 | 34.00 | TRAVEL1 |
2022-06-03 | 87.00 | 59.00 | 150.00 | 400.00 | STORE1 |
2022-06-03 | 45.00 | 790.00 | 450.00 | 104.00 | STORE2 |
2022-06-03 | 70.00 | 30.00 | 0.00 | 241.00 | STORE3 |
2022-06-03 | 30.00 | 120.00 | 11.00 | 72.00 | TRAVEL1 |
I want it to make it as new table as:
Date | TOTAL_SALE | STORE_TOTAL | TRAVEL_TOTAL |
---|---|---|---|
2022-06-02 | 2158.00 | 1529.00 | 629.00 |
2022-06-03 | 2659.00 | 2426.00 | 233.00 |
I tried with UNION but that puts the result one below other and not like this in the same row, I also tried the option below but am getting this error
#1111 invalid use of group function
Code I use that produces an error:
SELECT DATE, (SUM(CASH) SUM(CARD) SUM(CHEQUE) SUM(REST)) AS TOTAL_SALE,
SUM(case when TYPE LIKE 'STORE%' then (SUM(CASH) SUM(CARD) SUM(CHEQUE) SUM(REST))
else 0 end) as STORE_TOTAL,
SUM(case when TYPE LIKE 'TRAVEL%' then (SUM(CASH) SUM(CARD) SUM(CHEQUE) SUM(REST))
else 0 end) as TRAVEL_TOTAL
FROM tbl_Payment where DATE BETWEEN '2022-06-02' AND '2022-06-03'
GROUP BY DATE ASC
CodePudding user response:
First, group by
does not take an order. No asc
.
The problem is putting sum
inside a sum
. Whatever is inside sum
will be summed per row, there's no need to sum it again.
Similarly, you don't have to sum each column and then add the sums. Add the columns then sum. This is a bit more succinct.
SELECT
"DATE",
SUM(CASH CARD CHEQUE REST) AS TOTAL_SALE,
SUM(
case when TYPE LIKE 'STORE%' then
CASH CARD CHEQUE REST
else
0
end
) as STORE_TOTAL,
SUM(
case when TYPE LIKE 'TRAVEL%' then
CASH CARD CHEQUE REST
else
0
end
) as TRAVEL_TOTAL
FROM tbl_Payment
where "DATE" BETWEEN '2022-06-02' AND '2022-06-03'
GROUP BY "DATE"
Note: date
is a SQL keyword. It can be confused with the type date
. Avoid using it as a column name. Use the at
and on
conventions for naming timestamp and date columns. For example, paid_on
.