这是表结构,前6列为复合键。
col1 col2 col3 col4 col5 col6 col7 col8
A1 A2 A3 A4 A5 1 xx yy
A1 A2 A3 A4 A5 2 xxx yyy
A1 A2 A3 A4 A5 3 a b
A1 B2 A3 A4 A5 4 aa bb
B1 A2 A3 A4 A5 5 aaa bbb
B1 B2 B3 B4 B5 6 d e
B1 B2 B3 B4 B5 7 dd ee
B1 B3 C3 B4 B5 8 ddd eee
我需要一个存储过程,它返回如下的值
A1 A2 A3 A4 A5 xx yy xxx yyy a b
A1 B2 A3 A4 A5 aa bb
B1 A2 A3 A4 A5 aaa bbb
B1 B2 B3 B4 B5 d e dd ee
B1 B2 C3 B4 B5 ddd eee
感谢任何指示或帮助。
答案 0 :(得分:0)
如果您只需要这样的结果:
A1 A2 A3 A4 A5 xx,yy,xxx,yyy,a,b
A1 B2 A3 A4 A5 aa,bb
B1 A2 A3 A4 A5 aaa,bbb
B1 B2 B3 B4 B5 d,e,dd,ee
B1 B3 C3 B4 B5 ddd,eee
然后一个简单的查询就可以了:
select COL1
,COL2
,COL3
,COL4
,COL5
,LISTAGG(COL7 || ',' || COL8, ',') within group (order by COL6)
from TAB1
group by COL1, COL2, COL3, COL4, COL5
order by COL1, COL2, COL3, COL4, COL5
要获得动态数量的列,您需要创建动态SQL。有关该指南,请参阅this文章。
答案 1 :(得分:0)
首先,作为查询的标准结果集,您无法返回可变数量的列,但是您可以返回列,该列是xml列(在SQL 2005中引入)http://msdn.microsoft.com/en-us/library/ms345117%28v=sql.90%29.aspx,然后您可以将其绑定到。绑定必须是动态的。您可以使用pivot函数http://msdn.microsoft.com/en-us/library/ms177410.aspx可能有助于以您想要的格式呈现数据 - 或者如上所述,您可以使用动态SQL。如果这样做,您应该在存储过程中生成动态SQL,并使用sp_executesql执行您生成的字符串http://msdn.microsoft.com/en-us/library/ms175170.aspx,您可能需要传递参数http://support.microsoft.com/kb/262499以防止注入攻击。学习相当多的步骤...但是每一步都不是特别困难,而且是一项很好的练习!
答案 2 :(得分:0)
SELECT col1, col2, col3, col4, col5,
(SELECT ' ' + col7 + ' ' + col8 FROM TABLE1 t1
WHERE t1.col1 = t.col1 and t1.col2 = t.col2 and
t1.col3 = t.col3 and t1.col4 = t.col4 and t1.col5 = t.col5
ORDER BY col6
FOR XML PATH('')) AS mearge_col
FROM TABLE1 t
GROUP BY col1, col2, col3, col4, col5