Sql 需要对透视表结果进行排序,并且需要在单个查询中透视不同的集合

Sql 需要对透视表结果进行排序,并且需要在单个查询中透视不同的集合,sql,sql-server-2008,pivot,dynamic-pivot,Sql,Sql Server 2008,Pivot,Dynamic Pivot,这是我的后续问题,但实际上是一个新问题。我将分享一些信息,查询中的其他信息我无法完全理解,但我必须谨慎对待其中一些信息 在这个查询中,我创建了两个临时表,我将参考它们: IF OBJECT_ID('tempdb..#SAMHSA_PAT_LIST') IS NOT NULL DROP TABLE #SAMHSA_PAT_LIST CREATE TABLE #SAMHSA_PAT_LIST ( MRN VARCHAR(50), trac_id VARCHAR(50)) INSERT INTO #

这是我的后续问题,但实际上是一个新问题。我将分享一些信息,查询中的其他信息我无法完全理解,但我必须谨慎对待其中一些信息

在这个查询中,我创建了两个临时表,我将参考它们:

IF OBJECT_ID('tempdb..#SAMHSA_PAT_LIST') IS NOT NULL
DROP TABLE #SAMHSA_PAT_LIST
CREATE TABLE #SAMHSA_PAT_LIST (
MRN VARCHAR(50),
trac_id VARCHAR(50))

INSERT INTO #SAMHSA_PAT_LIST (MRN, trac_id) 
VALUES ('XXXXXXXX','001').....

在结构上,我接下来使用以下方法寻找具体的访问:

IF OBJECT_ID ('tempdb..#grantvisits') IS NOT NULL
DROP TABLE #grantvisits

SELECT
    spl.MRN
    ,spl.trac_id
    ,pev.CONTACT_DATE AS Visits

INTO
    #grantvisits

FROM
    #SAMHSA_PAT_LIST spl
    INNER JOIN dbo.IDENTITY_ID_VIEW iiv
    ON iiv.IDENTITY_ID=spl.MRN
    INNER JOIN dbo.PAT_ENC_VIEW pev
    ON pev.PAT_ID = iiv.PAT_ID

WHERE
    pev.CONTACT_DATE >= @Start_Date
    AND pev.CONTACT_DATE < @End_Date
    AND iiv.IDENTITY_ID = spl.MRN
    AND iiv.IDENTITY_TYPE_ID = XX
    AND pev.APPT_STATUS_C IN ( 2 , 6 , 8 , 9 )
trac_id mdxx    cnt
1   F33.1   504
1   F07.81  378
1   F31.9   189
5   F33.9   1825
5   F50.00  1400
5   F20.9   975
5   F20.3   700
5   F43.10  700
5   F43.10  625
5   F20.3   625
5   F19.10  625
10  F31.9   1547
10  F25.0   169
10  R45.851 91
10  R44.0   91
10  F31.74  39
trac_id mdxtemp01   mdxtemp02   mdxtemp03   mdxtemp04   mdxtemp05   mdxtemp06   mdxtemp07   mdxtemp08
001 F31.9   F07.81  F33.1                   
005 F43.10  F20.3   F19.10  F43.10  F20.3   F20.9   F50.00  F33.9
010 F31.74  R44.0   R45.851 F25.0   F31.9           
接下来,我查看访问并查找与MentalDX列表特别匹配的dx代码:

IF OBJECT_ID('tempdb..#mdxcounts') IS NOT NULL
DROP TABLE #mdxcounts


SELECT trac_id
    ,mdx1 AS mdxx
    ,COUNT(*) AS cnt
INTO #mdxcounts
FROM  #dxMentalHealth
WHERE mdx1 IS NOT NULL
GROUP BY
    trac_id
    ,mdx1
UNION
SELECT trac_id
    ,mdx2
    ,COUNT(*) AS cnt
FROM #dxMentalHealth
WHERE mdx2 IS NOT NULL
GROUP BY
    trac_id
    ,mdx2                    
UNION
SELECT trac_id
    ,mdx3
    ,COUNT(*) AS cnt
FROM #dxMentalHealth
WHERE mdx3 IS NOT NULL
GROUP BY
    trac_id
    ,mdx3   
UNION
SELECT trac_id
    ,mdx4
    ,COUNT(*) AS cnt
FROM #dxMentalHealth
WHERE mdx4 IS NOT NULL
GROUP BY
    trac_id
    ,mdx4   
UNION
SELECT trac_id
    ,mdx5
    ,COUNT(*) AS cnt
FROM #dxMentalHealth
WHERE mdx5 IS NOT NULL
GROUP BY
    trac_id
    ,mdx5   
UNION
SELECT trac_id
    ,mdx6
    ,COUNT(*) AS cnt
FROM #dxMentalHealth
WHERE mdx6 IS NOT NULL
GROUP BY
    trac_id
    ,mdx6;
接下来,我非常感谢@SqlZim通过重用以下内容让我开始关注数据:

我需要能够做的是按计数对mdxtemp*列中的值进行排序。作为参考并表明我还没有看到mdxcounts表中三个trac_id的结果如下:

IF OBJECT_ID ('tempdb..#grantvisits') IS NOT NULL
DROP TABLE #grantvisits

SELECT
    spl.MRN
    ,spl.trac_id
    ,pev.CONTACT_DATE AS Visits

INTO
    #grantvisits

FROM
    #SAMHSA_PAT_LIST spl
    INNER JOIN dbo.IDENTITY_ID_VIEW iiv
    ON iiv.IDENTITY_ID=spl.MRN
    INNER JOIN dbo.PAT_ENC_VIEW pev
    ON pev.PAT_ID = iiv.PAT_ID

WHERE
    pev.CONTACT_DATE >= @Start_Date
    AND pev.CONTACT_DATE < @End_Date
    AND iiv.IDENTITY_ID = spl.MRN
    AND iiv.IDENTITY_TYPE_ID = XX
    AND pev.APPT_STATUS_C IN ( 2 , 6 , 8 , 9 )
trac_id mdxx    cnt
1   F33.1   504
1   F07.81  378
1   F31.9   189
5   F33.9   1825
5   F50.00  1400
5   F20.9   975
5   F20.3   700
5   F43.10  700
5   F43.10  625
5   F20.3   625
5   F19.10  625
10  F31.9   1547
10  F25.0   169
10  R45.851 91
10  R44.0   91
10  F31.74  39
trac_id mdxtemp01   mdxtemp02   mdxtemp03   mdxtemp04   mdxtemp05   mdxtemp06   mdxtemp07   mdxtemp08
001 F31.9   F07.81  F33.1                   
005 F43.10  F20.3   F19.10  F43.10  F20.3   F20.9   F50.00  F33.9
010 F31.74  R44.0   R45.851 F25.0   F31.9           
但mdxpivot的结果显示如下:

IF OBJECT_ID ('tempdb..#grantvisits') IS NOT NULL
DROP TABLE #grantvisits

SELECT
    spl.MRN
    ,spl.trac_id
    ,pev.CONTACT_DATE AS Visits

INTO
    #grantvisits

FROM
    #SAMHSA_PAT_LIST spl
    INNER JOIN dbo.IDENTITY_ID_VIEW iiv
    ON iiv.IDENTITY_ID=spl.MRN
    INNER JOIN dbo.PAT_ENC_VIEW pev
    ON pev.PAT_ID = iiv.PAT_ID

WHERE
    pev.CONTACT_DATE >= @Start_Date
    AND pev.CONTACT_DATE < @End_Date
    AND iiv.IDENTITY_ID = spl.MRN
    AND iiv.IDENTITY_TYPE_ID = XX
    AND pev.APPT_STATUS_C IN ( 2 , 6 , 8 , 9 )
trac_id mdxx    cnt
1   F33.1   504
1   F07.81  378
1   F31.9   189
5   F33.9   1825
5   F50.00  1400
5   F20.9   975
5   F20.3   700
5   F43.10  700
5   F43.10  625
5   F20.3   625
5   F19.10  625
10  F31.9   1547
10  F25.0   169
10  R45.851 91
10  R44.0   91
10  F31.74  39
trac_id mdxtemp01   mdxtemp02   mdxtemp03   mdxtemp04   mdxtemp05   mdxtemp06   mdxtemp07   mdxtemp08
001 F31.9   F07.81  F33.1                   
005 F43.10  F20.3   F19.10  F43.10  F20.3   F20.9   F50.00  F33.9
010 F31.74  R44.0   R45.851 F25.0   F31.9           

如何对值进行重新排序?另外,我还要在查询所有不在MentalDX temp表中的DX代码时再次执行此操作。我需要用稍微不同的名称重做所有声明吗

当你说你想让它们按不同的顺序排列时,你的意思是你想先要大的数量吗?如果是这样,您可以将from子查询派生表中的row_number函数中的order by偶然设置为order by cnt DESC。再次感谢。当我使用“notin SELECT md.MHDX FROM MentalDX md”进入路径时,会发生什么情况?您建议我只做一组新的声明,还是只做一个新的“Select”语句?我将为该集合使用不同的临时表值。除非列名相同,并且数量相同,否则您还需要重新运行…@select_cols=和…@cols=部分,并重置@sql变量。我应该已经完成并尝试了,并且回答了我自己的问题。再次感谢@SqlZim为您提供的快速帮助。很高兴您已将其全部整理好