我在 SQL Server 2005 中使用以下语法创建了一个存储过程:
SELECT [Encounter Number], [AdmitDate - CCYYMMDD], [DischargeDate - CCYYMMDD],
Encounter.LengthOfStay
,pr.[1] as Proc1
,pr.[2] as Proc2
,pr.[3] as Proc3
,pr.[4] as Proc4
,pr.[5] as Proc5
,pr.[6] as Proc6
,pr.[7] as Proc7
,pr.[8] as Proc8
,pr.[9] as Proc9
,pr.[10] as Proc10
,pr.[11] as Proc11
,pr.[12] as Proc12
,pr.[13] as Proc13
,pr.[14] as Proc14
,pr.[15] as Proc15
,pr.[16] as Proc16
,pr.[17] as Proc17
,pr.[18] as Proc18
,pr.[19] as Proc19
,pr.[20] as Proc20
,pr.[21] as Proc21
,pr.[22] as Proc22
,pr.[23] as Proc23
,pr.[24] as Proc24
,pr.[25] as Proc25
,pr.[26] as Proc26
,pr.[27] as Proc27
,pr.[28] as Proc28
,pr.[29] as Proc29
,pr.[30] as Proc30
,pr.[31] as Proc31
,pr.[32] as Proc32
,pr.[33] as Proc33
,pr.[34] as Proc34
,pr.[35] as Proc35
,pr.[36] as Proc36
,pr.[37] as Proc37
,pr.[38] as Proc38
,pr.[39] as Proc39
,pr.[40] as Proc40
,pr.[41] as Proc41
,pr.[42] as Proc42
,pr.[43] as Proc43
,pr.[44] as Proc44
,pr.[45] as Proc45
,pr.[46] as Proc46
,pr.[47] as Proc47
,pr.[48] as Proc48
,pr.[49] as Proc49,
CASE
WHEN [Procedure Code (ENCTR)] in ('01.25','01.14','01.59') then 'Brain'
WHEN [Procedure Code (ENCTR)] = '03.09' then 'Spinal Canal'
WHEN [Procedure Code (ENCTR)] in ('06.4','06.81','26.32') then 'Head/Neck'
WHEN [Procedure Code (ENCTR)] in ('32.29','32.39','32.49','32.59') then 'Lungs/Thorax'
WHEN [Procedure Code (ENCTR)] in ('35.12','35.21','35.22','35.23','35.24') then 'Cardiac Valve'
WHEN [Procedure Code (ENCTR)] = '36.10' then 'CABG'
WHEN [Procedure Code (ENCTR)] = '00.66' then 'PCI'
WHEN [Procedure Code (ENCTR)] in ('37.33','37.34','37.35','37.36','37.37') then 'Excision Heart
Lesion'
WHEN [Procedure Code (ENCTR)] = '37.94' then 'Implant Auto Cardioversion/Defib System'
WHEN [Procedure Code (ENCTR)] in ('39.52','39.71','39.78') then 'Abdominal Aortic Aneurysm'
WHEN [Procedure Code (ENCTR)] in ('39.50','39.79','39.72','39.74','39.75','39.76','00.62')
then 'Other Vascular'
WHEN [Procedure Code (ENCTR)] = '38.12' then 'Carotid Endarterectomy'
WHEN [Procedure Code (ENCTR)] in ('38.18','39.29') then 'Lower Limb Vascular'
WHEN [Procedure Code (ENCTR)] in ('38.34','38.44','38.45','39.25','39.71') then 'Other Aortic
Vascular'
WHEN [Procedure Code (ENCTR)] in ('44.38','44.95','44.67') then 'Other Gastrointestinal'
WHEN [Procedure Code (ENCTR)] in
('45.71','45.72','45.73','45.74','45.76','45.77','45.78','45.79','45.81','45.82','45.83','45.41',
'45.42','45.43','45.44','45.45','45.46','45.47','45.48','45.49','48.35','48.63')
then 'Colorectal'
END as ProcGrouper
From Encounter
left outer join DimFactEncounter
on Encounter.EncounterNumber = DimFactEncounter.EncounterNumber
Left Outer JOIN ( SELECT *
FROM (SELECT [Encounter Number]
,[Procedure Code (Enctr)]
,Row_Number() OVER ( Partition By [Encounter Number] Order By [Encounter
Number], [Procedure Code (Enctr)] ) AS RowNumber
FROM EncounterProc) o
PIVOT ( MAX([Procedure Code (Enctr)] ) for RowNumber IN ( [1], [2], [3], [4], [5], [6], [7],
[8], [9], [10],[11], [12], [13], [14], [15], [16], [17], [18], [19], [20] ,[21], [22], [23], [24], [25], [26], [27], [28], [29], [30]
,[31], [32], [33], [34], [35], [36], [37], [38], [39], [40]
,[41], [42], [43], [44], [45], [46], [47], [48], [49]) ) t ) pr
on Encounter.EncounterNumber = EncounterProc.[Encounter Number]
where [Date of Service] between @StartDate and @EndDate
and Encounter.InOutCode = 'I'
and AdmitSubService <> 'SIG'
and Encounter.HSP# = 1
and Encounter.ActualTotalCharge > 0
and Encounter.Age >= 65
and Encounter.PayorGroup = 'Medicare'
and [ED Flag] is null
and [DischargeDisposition] not in ('MA', 'TA', '7Z')
and EncounterProc.[Procedure Code (ENCTR)] in
('01.25','01.14','01.59','03.09','06.4','06.81','26.32','32.29','32.39','32.49',
'32.59','35.12','35.21','35.22','35.23','35.24','36.10','00.66','37.33','37.34','37.35','37.36',
'37.37','37.94','39.52','39.71','39.78','39.50','39.79','39.72','39.74','39.75','39.76','00.62',
'38.12','38.18','39.29','38.34',
'38.44','38.45','39.25','39.71','44.38','44.95','44.67','45.71','45.72','45.73','45.74','45.75',
'45.76','45.77',
'45.78','45.79','45.81','45.82','45.83','45.41','45.42','45.43','45.44','45.45','45.46','45.47'
'45.48','45.49',
'48.35','48.63')
当我尝试更改存储过程时,我收到以下信息:
消息 4104,级别 16,状态 1,过程 sp_sc_ConRptsSurgery,第 16 行
无法绑定多部分标识符“EncounterProc.Encounter Number”。
必须对上述语法做什么才能更正上述错误?
更新:我将左外连接更改为以下内容:
Left Outer JOIN ( SELECT *
FROM (SELECT [Encounter Number]
,[Procedure Code (Enctr)]
,Row_Number() OVER
( Partition By [Encounter Number]
Order By [EncounterNumber], [Procedure Code (Enctr)] ) AS RowNumber
FROM EncounterProc) o
PIVOT ( MAX([Procedure Code (Enctr)] ) for RowNumber IN ( [1], [2], [3], [4], [5], [6], [7], [8], [9],
[10],[11], [12], [13], [14], [15], [16], [17], [18], [19], [20]
,[21], [22], [23], [24], [25], [26], [27], [28], [29], [30]
,[31], [32], [33], [34], [35], [36], [37], [38], [39], [40]
,[41], [42], [43], [44], [45], [46], [47], [48], [49]) ) t ) pr
on Encounter.EncounterNumber = pr.[Encounter Number]
更新 2:这是 EncounterProc 表的结构:
CREATE TABLE [dbo].[EncounterProc](
[COMPANY CODE] [varchar](5) NULL,
[ENCOUNTER NUMBER] [varchar](20) NOT NULL,
[PROCEDURE CODE (ENCTR)] [varchar](15) NOT NULL,
[DATE OF SERVICE] [varchar](8) NOT NULL,
[ENCOUNTER PROC SEQUENCE] [numeric](18, 0) NOT NULL,
[SURGERY FLAG] [varchar](1) NULL,
[ORDERING PHYSICIAN] [varchar](10) NULL,
[SURGEON] [varchar](10) NULL,
[ASSISTING SURGEON(1)] [varchar](10) NULL,
[ASSISTING SURGEON(2)] [varchar](10) NULL,
[SURGERY REASON] [varchar](10) NULL,
[ANESTHESIOLOGIST] [varchar](10) NULL,
[ANESTHESIA TYPE] [varchar](2) NULL,
[PERFUSIONIST] [varchar](10) NULL,
[NURSE ANESTHETIST] [varchar](10) NULL,
[ANESTHESIA START TIME] [varchar](6) NULL,
[ANESTHESIA STOP TIME] [varchar](6) NULL,
[SURGERY START TIME] [varchar](6) NULL,
[SURGERY STOP TIME] [varchar](6) NULL,
[ENTERED OP RM TIME] [varchar](6) NULL,
[LEFT OP RM TIME] [varchar](6) NULL,
[PACU ADMIT TIME] [varchar](6) NULL,
[PACU DISCHARGE TIME] [varchar](6) NULL,
[USER DEFINED 1] [varchar](30) NULL,
[USER DEFINED 2] [varchar](30) NULL,
[USER DEFINED 3] [varchar](30) NULL,
[USER DEFINED 4] [varchar](30) NULL,
[USER DEFINED 5] [varchar](30) NULL,
[USER DEFINED 6] [varchar](30) NULL,
[USER DEFINED 7] [varchar](30) NULL,
[USER DEFINED 8] [varchar](30) NULL,
[USER DEFINED NUMBER 1] [numeric](18, 4) NULL,
[USER DEFINED DATE 1] [varchar](8) NULL,
[PRINCIPLE SECONDARY PROC] [varchar](1) NULL,
[Updated] [datetime] NULL,
CONSTRAINT [PK_EncounterProc2] PRIMARY KEY CLUSTERED
(
[ENCOUNTER NUMBER] ASC,
[PROCEDURE CODE (ENCTR)] ASC,
[DATE OF SERVICE] ASC,
[ENCOUNTER PROC SEQUENCE] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,ALLOW_ROW_LOCKS
= ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
不幸的是,错误仍然存在,包括:
Msg 207, Level 16, State 1, Procedure sp_sc_ConRptsSurgery, Line 95
Invalid column name 'EncounterNumber'.
Msg 207, Level 16, State 1, Procedure sp_sc_ConRptsSurgery, Line 103
Invalid column name 'Date of Service'.
Msg 207, Level 16, State 1, Procedure sp_sc_ConRptsSurgery, Line 103
Invalid column name 'Date of Service'.
Msg 207, Level 16, State 1, Procedure sp_sc_ConRptsSurgery, Line 112
Invalid column name 'Procedure Code (ENCTR)'.
为什么这些列名被视为无效?
更新 3:不知道为什么我的问题被否决了?通过错误消息解析后,我将存储过程重组如下:
SELECT Encounter.EncounterNumber, [AdmitDate - CCYYMMDD], [DischargeDate - CCYYMMDD],
Encounter.LengthOfStay
,pr.[1] as Proc1
,pr.[2] as Proc2
,pr.[3] as Proc3
,pr.[4] as Proc4
,pr.[5] as Proc5
,pr.[6] as Proc6
,pr.[7] as Proc7
,pr.[8] as Proc8
,pr.[9] as Proc9
,pr.[10] as Proc10
,pr.[11] as Proc11
,pr.[12] as Proc12
,pr.[13] as Proc13
,pr.[14] as Proc14
,pr.[15] as Proc15
,pr.[16] as Proc16
,pr.[17] as Proc17
,pr.[18] as Proc18
,pr.[19] as Proc19
,pr.[20] as Proc20
,pr.[21] as Proc21
,pr.[22] as Proc22
,pr.[23] as Proc23
,pr.[24] as Proc24
,pr.[25] as Proc25
,pr.[26] as Proc26
,pr.[27] as Proc27
,pr.[28] as Proc28
,pr.[29] as Proc29
,pr.[30] as Proc30
,pr.[31] as Proc31
,pr.[32] as Proc32
,pr.[33] as Proc33
,pr.[34] as Proc34
,pr.[35] as Proc35
,pr.[36] as Proc36
,pr.[37] as Proc37
,pr.[38] as Proc38
,pr.[39] as Proc39
,pr.[40] as Proc40
,pr.[41] as Proc41
,pr.[42] as Proc42
,pr.[43] as Proc43
,pr.[44] as Proc44
,pr.[45] as Proc45
,pr.[46] as Proc46
,pr.[47] as Proc47
,pr.[48] as Proc48
,pr.[49] as Proc49,
CASE
WHEN [Procedure Code (ENCTR)] in ('01.25','01.14','01.59') then 'Brain'
WHEN [Procedure Code (ENCTR)] = '03.09' then 'Spinal Canal'
WHEN [Procedure Code (ENCTR)] in ('06.4','06.81','26.32') then 'Head/Neck'
WHEN [Procedure Code (ENCTR)] in ('32.29','32.39','32.49','32.59') then 'Lungs/Thorax'
WHEN [Procedure Code (ENCTR)] in ('35.12','35.21','35.22','35.23','35.24') then 'Cardiac Valve'
WHEN [Procedure Code (ENCTR)] = '36.10' then 'CABG'
WHEN [Procedure Code (ENCTR)] = '00.66' then 'PCI'
WHEN [Procedure Code (ENCTR)] in ('37.33','37.34','37.35','37.36','37.37') then 'Excision Heart
Lesion'
WHEN [Procedure Code (ENCTR)] = '37.94' then 'Implant Auto Cardioversion/Defib System'
WHEN [Procedure Code (ENCTR)] in ('39.52','39.71','39.78') then 'Abdominal Aortic Aneurysm'
WHEN [Procedure Code (ENCTR)] in ('39.50','39.79','39.72','39.74','39.75','39.76','00.62')
then 'Other Vascular'
WHEN [Procedure Code (ENCTR)] = '38.12' then 'Carotid Endarterectomy'
WHEN [Procedure Code (ENCTR)] in ('38.18','39.29') then 'Lower Limb Vascular'
WHEN [Procedure Code (ENCTR)] in ('38.34','38.44','38.45','39.25','39.71') then 'Other Aortic
Vascular'
WHEN [Procedure Code (ENCTR)] in ('44.38','44.95','44.67') then 'Other Gastrointestinal'
WHEN [Procedure Code (ENCTR)] in
('45.71','45.72','45.73','45.74','45.76','45.77','45.78','45.79','45.81','45.82','45.83','45.41',
'45.42','45.43','45.44','45.45','45.46','45.47','45.48','45.49','48.35','48.63')
then 'Colorectal'
END as ProcGrouper
From Encounter
left outer join DimFactEncounter
on Encounter.EncounterNumber = DimFactEncounter.EncounterNumber
Left Outer JOIN EncounterProc
on Encounter.EncounterNumber = EncounterProc.[Encounter Number]
Left Outer JOIN
(
SELECT [Encounter Number], [DATE OF SERVICE],
[1], [2], [3], [4], [5], [6], [7], [8], [9], [10],[11], [12], [13], [14], [15], [16], [17], [18],
[19], [20],[21], [22], [23], [24], [25], [26], [27], [28], [29], [30]
,[31], [32], [33], [34], [35], [36], [37], [38], [39], [40]
,[41], [42], [43], [44], [45], [46], [47], [48], [49]
FROM
(
SELECT [Encounter Number], [DATE OF SERVICE]
,[Procedure Code (Enctr)]
,Row_Number() OVER ( Partition By [Encounter Number] Order By [Encounter Number], [Procedure
Code (Enctr)] ) AS RowNumber
FROM EncounterProc
where [Procedure Code (ENCTR)] in
('01.25','01.14','01.59','03.09','06.4','06.81','26.32','32.29','32.39','32.49',
'32.59','35.12','35.21','35.22','35.23','35.24','36.10','00.66','37.33','37.34','37.35','37.36',
'37.37','37.94','39.52','39.71','39.78','39.50','39.79','39.72','39.74','39.75','39.76','00.62',
'38.12','38.18','39.29','38.34', '38.44','38.45','39.25','39.71','44.38','44.95','44.67','45.71','45.72','45.73','45.74','45.75',
'45.76','45.77', '45.78','45.79','45.81','45.82','45.83','45.41','45.42','45.43','45.44','45.45',
'45.46','45.47','45.48','45.49', '48.35','48.63')
) o
PIVOT
(
MAX([Procedure Code (Enctr)])
for RowNumber IN ( [1], [2], [3], [4], [5], [6], [7], [8], [9], [10],[11], [12], [13], [14],[15],
[16], [17], [18], [19], [20],[21], [22], [23], [24], [25], [26], [27], [28], [29], [30]
,[31], [32], [33], [34], [35], [36], [37], [38], [39], [40]
,[41], [42], [43], [44], [45], [46], [47], [48], [49])
) t
) pr
on pr.[Encounter Number] = Encounter.EncounterNumber
where pr.[Date of Service] between @StartDate and @EndDate
and Encounter.InOutCode = 'I'
and AdmitSubService <> 'SIG'
and Encounter.HSP# = 1
and Encounter.ActualTotalCharge > 0
and Encounter.Age >= 65
and Encounter.PayorGroup = 'Medicare'
and [ED Flag] is null
and [DischargeDisposition] not in ('MA', 'TA', '7Z')
存储过程现在运行无错误。但是,我看到相同的遭遇号重复了许多行,因为它有程序。如果有 7 个过程,则存储过程会为此遇到返回 7 行。
我将如何修改上面的更新代码以确保存储过程每次遇到只返回一行?