[英]mysql - running sums for multiple categories with group by clause
我有這張桌子:
CREATE TABLE tbl_sample
(
ID SERIAL PRIMARY KEY
,sale decimal(10,2)
,pc varchar(45)
,trans_date date
);
INSERT INTO tbl_sample
VALUES
(1,100, 'p1','2019-08-27' ),(2,150, 'p2', '2019-08-27'),(3,175,'p1', '2019-08-27')
,(4,250, 'p2', '2019-08-28'),(5,100, 'p2', '2019-08-28'),(6,88,'p1', '2019-08-28')
,(7,120, 'p1', '2019-08-29'),(8,130,'p1', '2019-08-29'),(9,275,'p2', '2019-08-29');
這個查詢:
select pc, trans_date, (select sum(x.sale) from tbl_sample x where x.id <= t.id and t.pc =
x.pc) - sale as accum_sales_beginning, sale, (select sum(x.sale) from tbl_sample x where
t.pc = x.pc and x.id <= t.id) as accum_sales_ending from tbl_sample t where t.trans_date
between '2019-08-27' and '2019-08-29' and t.pc = 'p1';
有一個結果:
| pc | trans_date | accum_sales_beginning | sale | accum_sales_ending |
--------------------------------------------------------------------------
| p1 | 2019-08-27 | 0.00 | 100.00 | 100.00 |
| p1 | 2019-08-27 | 100.00 | 175.00 | 275.00 |
| p1 | 2019-08-28 | 275.00 | 88.00 | 363.00 |
| p1 | 2019-08-29 | 363.00 | 120.00 | 483.00 |
| p1 | 2019-08-29 | 483.00 | 130.00 | 613.00 |
現在,當我使用“group by”子句時:
select t.pc, t.trans_date, (select sum(x.sale) from tbl_sample x where x.id <= t.id and
t.pc = x.pc) - sum(sale) as accum_sales_beginning, sum(sale), (select sum(x.sale) from
tbl_sample x where t.pc = x.pc and x.id <= t.id) as accum_sales_ending from tbl_sample t
where t.trans_date between '2019-08-27' and '2019-08-29' and t.pc = 'p1' group by
t.trans_date;
它給了我一個錯誤。 我使用的是 mysql 5.7,所以不能使用 window function 或“sum() over”。 下面是我想要的 output。 這可能嗎?
| pc | trans_date | accum_sales_beginning | sale | accum_sales_ending |
--------------------------------------------------------------------------
| p1 | 2019-08-27 | 0.00 | 275.00 | 275.00 |
| p1 | 2019-08-28 | 275.00 | 88.00 | 363.00 |
| p1 | 2019-08-29 | 363.00 | 250.00 | 613.00 |
此外,如果我將使用“2019-08-28”和“2019-08-29”之間的 trans_date 進行查詢,這將是所需的 output:
| pc | trans_date | accum_sales_beginning | sale | accum_sales_ending |
--------------------------------------------------------------------------
| p1 | 2019-08-28 | 275.00 | 88.00 | 363.00 |
| p1 | 2019-08-29 | 363.00 | 250.00 | 613.00 |
試試下面的代碼
SELECT
t.pc,
t.trans_date,
(
SELECT SUM(x.sale) FROM tbl_sample x
WHERE x.id <= MAX(t.id) AND t.pc = x.pc
-- Just used MAX(t.id) in place of t.id
-- As group by is available in the query
) -
SUM(sale) AS accum_sales_beginning,
SUM(sale),
(
SELECT SUM(x.sale) FROM tbl_sample x
WHERE t.pc = x.pc AND x.id <= MAX(t.id)
-- Just used MAX(t.id) in place of t.id
-- As group by is available in the query
) AS accum_sales_ending
FROM tbl_sample t
WHERE t.trans_date BETWEEN '2019-08-27' AND '2019-08-29'
AND t.pc = 'p1'
GROUP BY t.pc,t.trans_date;
在 MySQL 5.7 中,最有效的方法使用變量:
select trans_date, (accum_sales_ending - sales) as accum_sales_beginning, sales, accum_sales_ending
from (select trans_date, sales, (@s := @s + sales) as accum_sales_ending
from (select s.trans_date, sum(s.sale) as sales
from tbl_sample s
where s.pc = 'p1'
group by s.trans_date
order by s.trans_date
) s cross join
(select @s := 0) params
) s
where s.trans_date between '2019-08-28' and '2019-08-29' ;
這是一個 db<>fiddle。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.