繁体   English   中英

销售表中的汇总汇总

[英]Total summary from a sales table

我是新来的发展。 我在Oracle中有一个名为tbl_sale的表。 我在下面放置了表格结构,我还放置了我想要的确切报告。请帮我得到这个。 我想显示记录,其中parent = 0;

tbl_sale

ID  AMOUNT  PARENT
1   100     0
2   125.26  1
3   11      1
4   200     0
5   500     4
6   250     4
7   100     4
8   29      0

所需的输出:

ID  AMOUNT  PARENT
1   236.26  0
4   1050    0
8   29      0

这就是聚合函数和GROUP BY的目的:

SELECT   id, SUM(amount) AS amount, parent
FROM     tbl_sale
WHERE    parent = 0
GROUP BY id, parent

您可以利用递归CTE在SQL Server和Oracle中以这种方式进行操作

WITH q(id, amount, parent, top_most) AS 
(
  SELECT id, amount, parent, id 
    FROM tbl_sale 
   WHERE parent = 0
  UNION ALL
  SELECT t.id, t.amount, t.parent, q.id
    FROM tbl_sale t JOIN q 
      ON t.parent = q.id
)
SELECT top_most id, SUM(amount), MIN(parent) parent
  FROM q
 GROUP BY top_most

样本输出:

| ID | SUM(AMOUNT) | PARENT |
|----|-------------|--------|
|  1 |      236.26 |      0 |
|  4 |        1050 |      0 |
|  8 |          29 |      0 |

这是SQLFiddle演示( Oracle
这是SQLFiddle演示( SQL Server

您正在尝试根据源数据的顺序求和,这是不能保证的,可能会发生变化。 您需要重新设计tbl_sale以包含您要分组的行所共有的元素。

tbl_sale_line_tems

ID  AMOUNT  PARENT  sale_id  
1   100.00       0        1
2   125.26       1        1
3    11.00       1        1
4   200.00       0        2
5   500.00       4        2
6   250.00       4        2
7   100.00       4        2
8    29.00       0        3

现在,我们还可以推断出,在要出售的订单项组中,父订单项(0)始终具有最低的ID。

select min(ID) as ID
      ,sum(amount)
      ,sale_id
  from tbl_sale_line_items
 group by sale_id;

ID   AMOUNT  SALE_ID
 1   236.26        1
 4  1050.00        2
 8    29.00        3

这是另一种方式

SELECT 
  parent_id,
  sum(amount)
FROM
  ( SELECT 
      case when ts2.id IS NULL then ts1.id else ts2.id end as parent_id,
      ts1.amount
    FROM 
      tbl_sale ts1
      LEFT JOIN tbl_sale ts2 ON ( ts1.parent = ts2.id )
  )
GROUP BY
  parent_id
ORDER BY
  parent_id

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM