【问题标题】:Turn two tables and a link table into one big table将两张表和一张链接表变成一张大表
【发布时间】:2011-08-23 15:41:37
【问题描述】:

我试图寻找这个问题,但没有发现任何相关的问题。所以这里...

我有三张表,其中极其简化的版本是:

从业者:

  • practitioner_id :: int
  • name :: nvarchar

保险:

  • insurance_id :: int
  • name :: nvarchar

保险链接:

  • practitioner_id :: int
  • insurance_id :: int

所以,从业者表包含从业者列表,保险表包含保险列表,链接表表示哪个从业者支持哪种保险。

现在,我需要创建一个可以显示如下信息的视图:

视图表:

  • practitioner_id :: int
  • practitioner_name :: nvarchar
  • insurance_1 :: bit
  • insurance_2 :: bit .....
  • insurance_100 :: bit

换句话说,视图中的列是从业者的ID和姓名,以及Insurances中存在的每一个保险(以保险名称作为列名(有一个强制条件保险名称是唯一的))。保险栏中的单元格将指示该从业者是否支持该保险。

有什么办法吗?

或者更好的是,是否可以在 VB.NET 表单中的 DataSet 上使用 excel 样式的数据透视表?这也将解决我的许多问题。

【问题讨论】:

  • ViewTable 中的practitioner_name 很可能不是 int 列 - 对吧??
  • 是的,practice_name 是 nvarchar。

标签: sql vb.net sql-server-2005 pivot-table linktable


【解决方案1】:

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]))

我知道现在您想知道是否有任何方法可以避免列出所有保险名称/使其不是一个固定列表。答案是否定的,差不多。您可以以编程方式创建视图,但添加保险时仍需要更新视图。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多