9

我有一堆这样的表:

Lookup_HealthCheckupRisks
------------
ID  Name
1   Anemia
2   Anorexic
3   Bulemic
4   Depression
...
122   Syphilis



PatientRisksOnCheckup
------------------
ID CheckupID RiskID
1  11        2
2  11        3
3  12        1
4  14        1
5  14        3
...

但我需要一个扁平化版本,如下所示:

PatientCheckup
------------------
CheckupID Risk_1 Risk_2 Risk_3 Risk_4 .. Risk_122
11        0      1      1      0         0
12        1      0      0      0         0
13        0      0      0      0         0
14        1      0      1      0         0

我不知道如何做到这一点,我能想到的最好的方法是编写一个临时表,定义所有 122 列,然后执行If Exists ( SELECT * FROM PatientRisksOnCheckup where RiskID=i and checkupID=j ) INSERT INTO PatientCheckup (1) WHERE CheckupID=j并迭代i, j...>_<

只为一个表编写这个查询并不是最好的,但我需要为另外 30 个相同大小的表扁平化这样的数据。呃……请给点建议?

我也很想知道我正在做的事情是否是常见的事情......?

我需要对统计软件的 sql 数据进行非规范化/扁平化。

4

3 回答 3

10

您需要的称为交叉表查询。

如果您使用的是 Microsoft SQL Server,则可以使用PIVOT运算符来执行此操作。

其他品牌的 RDBMS 对这种类型的查询有不同的支持。最坏的情况是您必须使用动态 SQL 将查找表中的非常值硬编码到主表的连接中。当您有 122 个不同的值时,这是不切实际的。

另请参阅标记为pivotcrosstab的SO 问题。

于 2009-09-22T17:38:38.870 回答
1

使用 PIVOT TABLE Here-Microsofthere-tutorial

您将需要指定所有列。但是您可以使用sp_executesql命令来使用动态 SQL。

于 2009-09-22T17:40:42.137 回答
-1

如何在 INSERT AND UPDATE、DELETE 上使用触发器,以便这些非规范化表被填满......

于 2013-03-02T07:01:28.403 回答