2013-02-28 34 views
1

我有表:SQL:如何將表列顯示爲行?

name quantity 
abc  2 
abc  3 
abc  5 

我怎樣才能在MSSQL查詢,發現導致一排,像

abc 2 3 5 

感謝。

+0

多少列有你想要的結果嗎? 3或1的值與空格分隔? – 2013-02-28 15:27:07

回答

4

如果你想在單獨的列這個數據,那麼你可以使用PIVOT功能:

select * 
from 
(
    select name, quantity, 
    'Qty_'+cast(row_number() over(partition by name order by quantity) as varchar(10)) rn 
    from yourtable 
) src 
pivot 
(
    max(quantity) 
    for rn in (Qty_1, Qty_2, Qty_3) 
) piv 

SQL Fiddle with Demo。樞軸的結果是:

| NAME | QTY_1 | QTY_2 | QTY_3 | 
-------------------------------- 
| abc |  2 |  3 |  5 | 

如果你想在一列這個數據,那麼你可以使用FOR XML PATHSTUFF()

SELECT 
    t1.Name, 
    STUFF(
     (SELECT ' ' + cast(quantity as varchar(10)) 
      FROM yourtable t2 
      WHERE t1.name = t2.name 
      FOR XML PATH ('')) 
      , 1, 1, '') AS List 
FROM yourtable t1 
GROUP BY t1.Name 

SQL Fiddle with Demo。此查詢的結果是:

| NAME | LIST | 
---------------- 
| abc | 2 3 5 | 

隨着旋轉功能,如果你有數目不詳的量值,那麼你可以使用動態SQL:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(rn) 
        from 
        (
         select 'Qty_'+cast(row_number() over(partition by name order by quantity) as varchar(10)) rn 
         from yourtable 
        ) t 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT name,' + @cols + ' from 
      (
       select name, quantity, 
        ''Qty_''+cast(row_number() over(partition by name order by quantity) as varchar(10)) rn 
       from yourtable 
      ) x 
      pivot 
      (
       max(quantity) 
       for rn in (' + @cols + ') 
      ) p ' 

execute(@query) 

SQL Fiddle with Demo

+0

謝謝。但是如果我有隨機數行'abc qty',第一個例子會工作嗎? – 2013-02-28 15:51:41

+0

@SergiiRechmp請參閱我的編輯。如果你使用的是數據透視函數和它的值數量未知,那麼你將不得不使用動態sql – Taryn 2013-02-28 15:55:28

+0

謝謝bluefeet,它運作良好。但它對我來說有點困難。你能告訴我,我可以在哪裏輸入where子句(例如'where quantity> 3')以及如何從最小值到最大值刪除排序?我不需要它,似乎我做了一個壞榜樣。 – 2013-03-04 15:51:43