2011-12-19 40 views
0

可能重复:
dynamic sql pivot in sql server分组由列数据

我有一个表叫Col_values和Col_ID是一个标识字段中的数据是这样的:

Val_ID  Col_ID  Value 
76951792  3   Closed 
76951791  3   Closed 
76951790  25   Open 
76951789  25   Closed 
76951792  1   US 
76951791  1   Canada 

和另一个表称为Et_Col,数据如下所示:

Col_ID Col_Name D_ID 
3  Status  1 
25  Status  2 
1  Country 1 

我想要的输出:

Val_ID  Status Country 
76951792 Closed  US 
76951791 Closed  Canada 
76951790 Open  Null 
76951789 Closed  Null 

所以我写了一个光标,以获得输出光标返回语句,如:

Select val_ID 
    ,max(case when Col_ID = 3 then Value end) as Status 
    ,max(case when Col_ID = 25 then Value end) as Status 
    ,max(CASE WHEN Col_ID = 1 THEN VALUE END) AS Country 
    From Col_values 
    Group by Val_ID 

这给了我输出:

Val_ID Status Status Country 
76951792 Closed Null  US 
76951791 Closed Null  Canada 
76951789 Null  Closed Null 
76951790 Null  Open  Null 

我该如何解决这个问题?

+0

你知道术语标准化吗? – 2011-12-19 17:51:41

+0

这可以通过动态数据透视表完成:http://stackoverflow.com/questions/8327261/dynamic-sql-pivot-in-sql-server – JeffO 2011-12-19 18:07:52

回答

1

应该可以改变你的光标,它会产生这样的SQL,则:

select 
    val_id 
    ,max(case when Col_name = 'Status' then Value end) as Status 
    ,max(case when Col_name = 'Country' then Value end) as Country 
from 
    col_values v 
    join ET_Col c on v.col_id=c.col_id 

group by val_id 

不同的是,你正在使用的COL_NAME代替col_id列之间分割,所以涨了一倍列名称将合并。

+0

我只是给了你一些样本数据,但是大约有100个Col_ID。所以我不能写SQl这就是为什么我写了光标,它给了我我上面写的select语句 – peter 2011-12-19 17:54:18

+0

我已经更新了。我想你可以很容易地根据你已经能够生成的sql生成sql。 – 2011-12-19 18:11:28

1
select val_id, value as Status 
from col_values 

这就是你想要的产出。你为什么认为你需要分组数据才能获得?

+0

请看我编辑的问题。我已经在表格中添加了更多的示例数据。所以你可以看到为什么我将数据分组 – peter 2011-12-19 17:41:45

+0

枢轴是你寻找的关键词:非常类似于http://stackoverflow.com/questions/1677645/using-pivot-in-sql-server-2008 – xQbert 2011-12-19 17:50:53