将表行连接为列值 sql

smiller48

在这种情况下,我加入了两个表,由于每个医生都可以拥有多个许可证,因此它会创建多个重复项。我想将多个许可证状态和编号附加到表 1 中,如下所示。

这将需要动态完成,因为它可能是分配给一名医生的大量许可证。

表 1 看起来像这样。

assignid  physician_name  profession 
-------------------------------
    1        bob          md        
    2        travis       do        
    3        ryan         md        
    4        pete         pa        
    5        susan        np         
    6        ashley       cnp     

表 2

assignid  license_state license_num
-------------------------------
     1       oh        561
     2       mi        987
     3       ca        785
     4       ny        965
     4       mi        125
     5       oh        369
     5       ca        541

加入

assignid  physician_name  profession license_state license_num
----------------------------------------------------------------
    1        bob          md             oh           561
    2        travis       do             mi           987
    3        ryan         md             ca           785
    4        pete         pa             ny           965
    4        pete         pa             mi           125
    5        susan        np             oh           369
    5        susan        np             ca           541

我想动态地将连接表更改为如下所示。

assignid  physician_name  profession license_state1 license_num1 license_state2 license_num2
--------------------------------------------------------------------------------------------------
   1        bob          md             oh           561
   2        travis       do             mi           987
   3        ryan         md             ca           785
   4        pete         pa             ny           965             mi       125
   5        susan        np             oh           369             ca       541

我尝试了这条路线,但这给了我列标题的状态。

WITH pivotdata AS (
SELECT assignid,physician_name, profession, license_state,license_num
FROM dbo.Physicians p JOIN dbo.Licenses l ON p.AssignID = l.AssignID
)

SELECT *
FROM
   pivotdata
   PIVOT (MAX(license_num) FOR license_state IN ([oh], [mi], [ca],[ny])) TT;

结果

physician_name  profession   oh  mi  ca  ny
-------------------------------------------
    bob          md          561
    travis       do             987
    ryan         md                  785
    pete         pa             125     965
    susan        np          369     541
肖恩·兰格

您可以使用动态交叉表解决此问题。我从 Jeff Moden 和他的文章中学到了这项技术。http://www.sqlservercentral.com/articles/Crosstab/65048/

if OBJECT_ID('tempdb..#Physicians') is not null
    drop table #Physicians

create table #Physicians
(
    AssignID int
    , PhysicianName varchar(20)
    , Profession varchar(10)
)

insert #Physicians values
(1, 'bob', 'md')
, (2, 'travis', 'do')
, (3, 'ryan', 'md')
, (4, 'pete', 'pa')
, (5, 'susan', 'np')
, (6, 'ashley', 'cnp')

if OBJECT_ID('tempdb..#Licenses') is not null
    drop table #Licenses

create table #Licenses
(
    AssignID int
    , LicenseState char(2)
    , LicenseNum int
)

insert #Licenses values
(1, 'oh', 561)
, (2, 'mi', 987)
, (3, 'ca', 785)
, (4, 'ny', 965)
, (4, 'mi', 125)
, (5, 'oh', 369)
, (5, 'ca', 541)

declare @StaticPortion nvarchar(2000) = 
    'with OrderedResults as
    (
        SELECT p.AssignID
            , p.PhysicianName
            , p.Profession
            , l.LicenseState
            , l.LicenseNum
            , ROW_NUMBER() over(partition by p.AssignID order by l.LicenseState) as RowNum
        FROM #Physicians p 
        JOIN #Licenses l ON p.AssignID = l.AssignID
    )
    select AssignID';

declare @DynamicPortion nvarchar(max) = '';
declare @FinalStaticPortion nvarchar(2000) = ' from OrderedResults Group by AssignID order by AssignID';

--the following cte is a tally table (another trick I learned from Jeff Moden)
with E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
cteTally(N) AS 
(
    SELECT  ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E2
)

select @DynamicPortion = @DynamicPortion + 
    ', MAX(Case when RowNum = ' + CAST(N as varchar(6)) + ' then LicenseState end) as LicenseState' + CAST(N as varchar(6)) + CHAR(10)
    + ', MAX(Case when RowNum = ' + CAST(N as varchar(6)) + ' then LicenseNum end) as LicenseNum' + CAST(N as varchar(6)) + CHAR(10)
from cteTally t
where t.N <= 
(
    select top 1 Count(p.AssignID)
    FROM #Physicians p 
    JOIN #Licenses l ON p.AssignID = l.AssignID
    group by p.AssignID
    order by COUNT(*) desc
)


declare @SqlToExecute nvarchar(max) = @StaticPortion + @DynamicPortion + @FinalStaticPortion;

--you can comment the following. it is here for now so you can view the dynamic sql before it executes
select @SqlToExecute

--Once you are satisfied that the dynamic sql generated is correct simply uncomment the below line
--exec sp_executesql @SqlToExecute

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

连接SQL表并将列显示为行以生成报告

来自分类Dev

连接SQL表并将列显示为行以生成报告

来自分类Dev

MS SQL矩阵-将列显示为行,将行值显示为列

来自分类Dev

SQL根据联接表中链接记录的值匹配将列设置为指定值

来自分类Dev

SQL根据联接表中链接记录的值匹配将列设置为指定值

来自分类Dev

T-SQL 将内部连接表的行转换为列

来自分类Dev

SQL Server - 将行转为列的 2 个表之间连接的更好解决方案

来自分类Dev

SQL:将表与自身连接并允许结果为空

来自分类Dev

SQL-将变量设置为另一个表中列的值

来自分类Dev

SQL将数据透视表的行改为N行(基于列值)

来自分类Dev

SQL将行汇总为列(枢轴?)

来自分类Dev

SQL 将行转置为列

来自分类Dev

将一个表中的行集合连接到另一个表的列 - SQL Server

来自分类Dev

将字段名称显示为列,将字段值显示为 sql server 中的行

来自分类Dev

将一列的值选择为一行-SQL Server

来自分类Dev

如何将行值设置为 SQL Server 中的列?

来自分类Dev

如果在 SQL 表中找不到值,如何将行值设置为“否”?

来自分类Dev

将Temp列的结果连接到表SQL Server

来自分类Dev

将SQL表中的值求和为其他SQL表中的值

来自分类Dev

根据位置将一个表的列安排为Microsoft SQL Server中另一表中的行

来自分类Dev

SQL Server 方法将连接表的前 10 个 SELECTED 行(所有列)放入数组或变量表中

来自分类Dev

SQL如何在ID的现有表中将表的值参数连接为值

来自分类Dev

在 SQL Server 中将表行展平为列

来自分类Dev

SQL将一个表连接到第二个表中包含每组最大值的行的选择

来自分类Dev

使用一些预定义的值将行插入 SQL 表,一些来自另一个表以及连接字符串。

来自分类Dev

SQL将唯一值计数为单独的列

来自分类Dev

在SQL中将两列值显示为两行

来自分类Dev

在SQL中将两列值显示为两行

来自分类Dev

SQL 没有返回列值为 NULL 的行

Related 相关文章

  1. 1

    连接SQL表并将列显示为行以生成报告

  2. 2

    连接SQL表并将列显示为行以生成报告

  3. 3

    MS SQL矩阵-将列显示为行,将行值显示为列

  4. 4

    SQL根据联接表中链接记录的值匹配将列设置为指定值

  5. 5

    SQL根据联接表中链接记录的值匹配将列设置为指定值

  6. 6

    T-SQL 将内部连接表的行转换为列

  7. 7

    SQL Server - 将行转为列的 2 个表之间连接的更好解决方案

  8. 8

    SQL:将表与自身连接并允许结果为空

  9. 9

    SQL-将变量设置为另一个表中列的值

  10. 10

    SQL将数据透视表的行改为N行(基于列值)

  11. 11

    SQL将行汇总为列(枢轴?)

  12. 12

    SQL 将行转置为列

  13. 13

    将一个表中的行集合连接到另一个表的列 - SQL Server

  14. 14

    将字段名称显示为列,将字段值显示为 sql server 中的行

  15. 15

    将一列的值选择为一行-SQL Server

  16. 16

    如何将行值设置为 SQL Server 中的列?

  17. 17

    如果在 SQL 表中找不到值,如何将行值设置为“否”?

  18. 18

    将Temp列的结果连接到表SQL Server

  19. 19

    将SQL表中的值求和为其他SQL表中的值

  20. 20

    根据位置将一个表的列安排为Microsoft SQL Server中另一表中的行

  21. 21

    SQL Server 方法将连接表的前 10 个 SELECTED 行(所有列)放入数组或变量表中

  22. 22

    SQL如何在ID的现有表中将表的值参数连接为值

  23. 23

    在 SQL Server 中将表行展平为列

  24. 24

    SQL将一个表连接到第二个表中包含每组最大值的行的选择

  25. 25

    使用一些预定义的值将行插入 SQL 表,一些来自另一个表以及连接字符串。

  26. 26

    SQL将唯一值计数为单独的列

  27. 27

    在SQL中将两列值显示为两行

  28. 28

    在SQL中将两列值显示为两行

  29. 29

    SQL 没有返回列值为 NULL 的行

热门标签

归档