2011-09-21 212 views
0

如何將多行組合成一行並且包含逗號分隔值的列?包含逗號分隔值的sql列

例子:本來我SQLRESULT將返回以下使用像

select order_no, item_no, item_description 
from orders... 

order_no  item_no item_description 
1234   5  toaster 
1234   6  hair dryer 

一個簡單的選擇腳本,而不是我想的結果返回到下面(中具有相同的順序item_nos列出的item_description

order_no  item_nos item_descriptions 
1234   5, 6  toaster, hair dryer 

我能回到這樣的結果嗎?

order_no item_nos_descriptions 
1234  5 - toaster, 6 - hair dryer 

順便說一句,我使用SQL 2008 ...

+3

它聞起來像一個可怕的設計。關係數據庫被設計爲規範化的。 – 2011-09-21 05:35:42

+0

SQL有哪些風味? Sql-Server,MySQL,Postgres,Oracle? –

+0

我認爲這不是模式,而是演示/報告。 –

回答

1

退房的group_concat函數的n(docs)。

select 
    order_no, 
    group_concat(item_no ORDER BY item_nos ASC SEPARATOR ', ') as item_nos, 
    group_concat(item_description ORDER BY item_no ASC SEPARATOR ', ') 
    as item_descriptions 
from orders 
group by order_no 

會給這樣的事情:

order_no  item_nos item_descriptions 
1234   5, 6  toaster, hair dryer 

對於您所請求的第二種形式,它會是這個樣子:

select 
    order_no, 
    group_concat(concat(item_no,' - ',item_description 
    ORDER BY item_no ASC SEPARATOR ', ') 
    as item_nos_descriptions 
from orders 
group by order_no 
0

我認爲你應該留意@pst,如果你可以。

也就是說,大多數關係數據庫都有一個功能來做到這一點。在MySQL中它是group_concat。在Oracle中它是wm_concat。在PostgreSQL中它是string_agg。注意它非常不標準。

要使用它,你會做這樣的事情:

SELECT order_no, string_agg(item_description, ',') 
FROM orders 
INNER JOIN line_items ON line_item.order_id = order.id 
GROUP BY order_no; 

請注意,並非所有的數據庫有辦法從CSV要回行。這是我知道PostgreSQL可以做的事情。我希望甲骨文能夠做到這一點,但沒有檢查過,而且我相信MySQL不能,但可能會弄錯。

0

嘗試GROUP_CONCAT如果你正在使用MySQL:

SELECT order_no, 
    GROUP_CONCAT(item_no ORDER BY item_no ASC SEPARATOR ','), 
    GROUP_CONCAT(item_description ORDER BY item_no ASC SEPARATOR ',') 
FROM Orders 
GROUP BY order_no 

這樣你可以保持原有的標準化DB模式,仍然可以得到以下結果:

order_no  item_nos item_descriptions 
1234   5, 6  toaster, hair dryer 
+0

嗨,我目前正在運行SQL 2008,但我不斷收到錯誤消息「關鍵字'ORDER'附近的語法不正確。」? – HL8

0

對於MySQL,你可以這樣做:

SELECT order_no, 
    GROUP_CONCAT(CONCAT(item_no,' - ',item_description) ORDER BY item_no ASC SEPARATOR ', ') 
FROM Orders 
GROUP BY order_no 
2

對於SQL Server 2005及以上,這裏的我通常不使用遞歸CTE的方式

DECLARE @T TABLE 
(
order_no int, 
item_no int, 
item_description nvarchar(50) 
) 


INSERT INTO @T VALUES (1234, 5, 'toaster') 
INSERT INTO @T VALUES (1234, 6, 'hair dryer') 

SELECT order_no, 
    STUFF(
     (
      SELECT ', ' + CAST(item_no AS VARCHAR) AS [text()] 
      FROM @T As MyItem 
      WHERE MyItem.order_no = MyTable.order_no 
      FOR XML PATH('') 
     ), 1, 2, '') AS item_nos, 
    STUFF(
     (
      SELECT ', ' + CAST(item_no AS VARCHAR) AS [text()] 
      FROM @T As MyItem 
      WHERE MyItem.order_no = MyTable.order_no 
      FOR XML PATH('') 
     ), 1, 2, '') AS item_descriptions 
FROM @T AS MyTable 
GROUP BY order_no 

這產生了:

Result Set (1 item) 
order_no | item_nos | item_descriptions | 
1234  | 5, 6   | 5, 6 

東西從字符串刪除最後 ''。

的另一種方法就是使用遞歸CTE,但我認爲上面會做...