有幾種方法,你可以得到你想要的結果,但爲了順利返回多個carid
值爲每個name
和period
,我會用一個窗口函數像row_number()
生成的每個分區的唯一序列name
/period
。
您的查詢將使用類似的開始:
select name, carid, period,
'col'+
cast(row_number() over(partition by name, period
order by carid) as varchar(10)) seq
from yourtable;
見SQL Fiddle with Demo。這將給你下面的數據,然後你可以將PIVOT轉換爲列。
| NAME | CARID | PERIOD | SEQ |
|-------|-------|--------|------|
| Bob | 121 | Feb 08 | col1 |
| Bob | 121 | Jan 08 | col1 |
| Bob | 123 | Jan 08 | col2 |
| Ruth | 139 | Feb 08 | col1 |
| Steve | 121 | Jan 08 | col1 |
然後,您可以將此數據轉換成列,使用聚合功能,類似於一個CASE表達式:
select
name,
period,
max(case when seq = 'col1' then carid end) col1,
max(case when seq = 'col2' then carid end) col2,
max(case when seq = 'col3' then carid end) col3
from
(
select name, carid, period,
'col'+
cast(row_number() over(partition by name, period
order by carid) as varchar(10)) seq
from yourtable
) d
group by name, period;
見SQL Fiddle with Demo。這也可以轉換成使用PIVOT
功能列:
select name, period, col1, col2, col3
from
(
select name, carid, period,
'col'+
cast(row_number() over(partition by name, period
order by carid) as varchar(10)) seq
from yourtable
) d
pivot
(
max(carid)
for seq in (col1, col2, col3)
) p;
參見SQL Fiddle with Demo。以上兩個疑問會是不錯的,如果你有值的數量有限,但如果你有未知的值,那麼你將不得不使用動態SQL生成結果:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(seq)
from
(
select 'col'+
cast(row_number() over(partition by name, period
order by carid) as varchar(10)) seq
from yourtable
) d
group by seq
order by seq
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT name, period,' + @cols + '
from
(
select name, carid, period,
''col''+
cast(row_number() over(partition by name, period
order by carid) as varchar(10)) seq
from yourtable
) x
pivot
(
max(carid)
for seq in (' + @cols + ')
) p '
execute sp_executesql @query;
見SQL Fiddle with Demo。所有版本會給你類似的結果:
| NAME | PERIOD | COL1 | COL2 |
|-------|--------|------|--------|
| Bob | Feb 08 | 121 | (null) |
| Ruth | Feb 08 | 139 | (null) |
| Bob | Jan 08 | 121 | 123 |
| Steve | Jan 08 | 121 | (null) |
你正在尋找一個「交叉表」。見http://www.postgresql.org/docs/9.3/static/tablefunc.html – maybeWeCouldStealAVan
看着這個,看起來你需要知道你需要多少列? –
@bluefeet我的腦部故障 - 我看到一個不存在的Postgresql標籤。 – maybeWeCouldStealAVan