我试着寻找这个问题,但没有发现任何相关内容。所以这里......
我有三张桌子,其简化版本是:
执业:
practitioner_id :: int
name :: nvarchar
保险:
insurance_id :: int
name :: nvarchar
InsuranceLink:
practitioner_id :: int
insurance_id :: int
因此,从业者表包含从业者列表,保险表包含保险列表,链表表示哪位从业者支持哪种保险。
现在,我需要创建一个可以显示如下信息的视图:
ViewTable:
practitioner_id :: int
practitioner_name :: nvarchar
insurance_1 :: bit
insurance_2 :: bit
..... insurance_100 :: bit
换句话说,视图中的列是从业者的ID和名称,以及保险中存在的每种保险(保险名称作为列名称(存在强制条件)保险名称是唯一的))。保险栏中的单元格将指示该从业者是否支持该保险。
有没有办法做到这一点?
或者更好的是,是否可以在VB.NET表单中的DataSet上使用excel样式的数据透视表?这也解决了我的许多问题。
答案 0 :(得分:2)
PIVOT是您正在寻找的关键字。
select * from
(select
practitioner_id,
practitioner_name,
insurance_name
from practitioner p
join insurancelink il on p.practitioner_id = il.practitioner_id
join insurance i on il.insurance_id = i.insurance_id
)
pivot (count(*) for insurance_name in ([insurancename1],[insurancename2], ..., [insurancename100]))
我知道现在你想知道是否有办法避免列出所有保险名称/它不是一个常数列表。答案是否定的,差不多。您可以以编程方式创建视图,但在添加保险时仍需要更新视图。