销售表中的总摘要

时间:2013-12-22 06:10:09

标签: sql sql-server oracle

我是发展新手。我在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

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

您可以通过利用递归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

答案 2 :(得分:0)

您试图根据源数据的顺序求和,这是不保证的并且可能会发生变化。 您需要重新设计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

答案 3 :(得分:0)

这是另一种方法

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