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为您提供的快速帮助。很高兴您已将其全部整理好