我有一堆像这样的表:
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数据进行非规范化/扁平化。
答案 0 :(得分:10)
您需要的是一个交叉表查询。
如果您使用的是Microsoft SQL Server,则可以使用PIVOT
运算符来执行此操作。
其他品牌的RDBMS对此类查询有不同的支持。最糟糕的情况是,您必须使用动态SQL将查找表中的非常值代码硬编码到主表的连接中。当你有122个不同的值时,这是不切实际的。
答案 1 :(得分:1)
使用PIVOT TABLE Here - Microsoft和here - tutorial。
您需要hovewer来指定所有列。但您可以使用sp_executesql命令来使用动态SQL。
答案 2 :(得分:-1)
如何在INSERT AND UPDATE,DELETE上使用触发器,以便填充这些非规范化表...