3

我正在使用 Postgresl 9.2

我需要一个由此创建的交叉表:

select id, imp from sg_imp_id(有很多比这更多的行)

  id   |  imp  |
-------+-------+
  1    |  111  |
  2    |  111  | 
  2    |  121  | 
  2    |  122  |
  3    |  131  |
  4    |  154  |
  ....    ....

像这样:

    id   | x111 | x121 | x122 | x131 | x154 |
---------+------+------+------+------+------+
    1    |   1  |   0  |  0   |  0   |  0   |
    2    |   1  |   1  |  1   |  0   |  0   |
    3    |   0  |   0  |  0   |  1   |  0   |
    4    |   0  |   0  |  0   |  0   |  1   |

imp行都有一列,只要id有那个imp数字,就放置一个 1。如果它没有那个imp数字,那么一个 0 应该在那个位置。我对该crosstab()功能的了解非常有限。目前有很多不同的“x111,x112,x113”值行,所以使用该case子句不太可能。

4

2 回答 2

2

不确定 crosstab() 函数,但您始终可以手动旋转:

select
    id,
    max(case when imp = 111 then 1 else 0 end) as x111,
    max(case when imp = 121 then 1 else 0 end) as x121,
    max(case when imp = 122 then 1 else 0 end) as x122,
    max(case when imp = 131 then 1 else 0 end) as x131,
    max(case when imp = 154 then 1 else 0 end) as x154
from Table1
group by id

sql fiddle demo

于 2013-11-05T20:06:50.493 回答
0

请尝试一下,它对你有用

DECLARE @SQL VARCHAR(MAX)
SELECT  @SQL = ISNULL(@SQL, '') + ',
(
SELECT  
 id 
FROM  stacky.dbo.crosstab t' + Rownum + ' 
WHERE   t' + Rownum + '.id = t.id   AND     t' + Rownum + '.imp = ''' + imp + ''' 
) 
[x' + imp + ']'
FROM ( SELECT  imp, CONVERT(VARCHAR, ROW_NUMBER() OVER (ORDER BY imp)) [RowNum] FROM   stacky.dbo.crosstab  GROUP BY imp) d



SET @SQL = 'SELECT id ' + @SQL + ' FROM (SELECT DISTINCT id FROM stacky.dbo.crosstab) t'
EXEC (@SQL)

请更改数据库名称和 (id int),(imp varchar(20)) 类型 其他然后使用强制转换

于 2013-11-12T13:15:13.607 回答