【问题标题】:SQL statement to summarize, aggregate and concatenate [duplicate]用于汇总、聚合和连接的 SQL 语句 [重复]
【发布时间】:2014-08-25 05:55:42
【问题描述】:

我有一个如下所示的订单备注表:

ORDER  NOTE
10000  some notes
10000  another note
20000  a new note
30000  note 1
30000  note 2

我想汇总每个订单一行,然后是所有相关注释,如下所示:

ORDER  NOTES
10000  some notes, another note
20000  a new note
30000  note 1, note 2

有SQL语句可以帮到我吗?

修订---

数据库是 IBM db/2,但如果存在的话,更喜欢 SQL ANSI 解决方案。

【问题讨论】:

标签: sql db2 concatenation aggregate-functions


【解决方案1】:

如果您使用的是 MS Sql2005+,那么这应该适合您:

CREATE FUNCTION GetOrderNotes(@OrderNumber INT) 
RETURNS NVARCHAR(MAX) 
AS
BEGIN 

    DECLARE @ReturnText NVARCHAR(MAX)

    SET @ReturnText = ''


    IF EXISTS(SELECT * FROM Orders WHERE OrderNumber = @OrderNumber) 
    BEGIN 
        SELECT 
            @ReturnText = COALESCE(@ReturnText,'') + ISNULL(Note,'') + ', '
        FROM 
            Orders
        WHERE 
            OrderNumber = @OrderNumber

    END 


    RETURN @ReturnText

END


GO 


/*THEN JUST CALL THIS FUNCTION FROM WITHIN YOUR QUERY*/

SELECT 
    OrderNumber 
    , dbo.GetOrderNotes(OrderNumber) AS [Notes Combined] 
FROM 
    Orders
GROUP BY 
    OrderNumber 
ORDER BY 
    OrderNumber 

显然根据需要替换表和列定义,但这应该可以让您到达您需要的位置。

我通常会尝试为这类事情创建函数,这样我就不必一直写出相同的代码/可以在多个地方使用它。因此,如果我的要求发生变化,那么我可以在这里进行更改,而不必在六个地方进行更改。

【讨论】:

  • 除了 OP 显然使用的是 DB2,我不确定这种技术是否有效。除了它应该作为副本关闭。
  • @Clockwork-Muse 我回答时数据库技术不在 OP 中。
猜你喜欢
  • 1970-01-01
  • 2011-02-20
  • 1970-01-01
  • 2020-03-07
  • 2015-09-28
  • 2018-12-28
  • 1970-01-01
  • 1970-01-01
  • 2017-04-19
相关资源
最近更新 更多