Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
优化多查询代码SQL Server 2008 R2_Sql_Tsql_Sql Server 2008 R2_Subquery_Query Optimization - Fatal编程技术网

优化多查询代码SQL Server 2008 R2

优化多查询代码SQL Server 2008 R2,sql,tsql,sql-server-2008-r2,subquery,query-optimization,Sql,Tsql,Sql Server 2008 R2,Subquery,Query Optimization,我在加入的两个表中有数据。表A如下所示: VISIT ID | ADM_DATE | ... 12345678 | 1800-01-01 | ... ... VISIT ID | CLASFPRIO | CLASFCD | CLASFTYPE 12345678 | 01 | ###.## | DF 12345678 | 02 | ###.## | DF 12345678 | 03 | ###.## | DF A.VISIT ID | B.C

我在加入的两个表中有数据。表A如下所示:

VISIT ID | ADM_DATE   | ...
12345678 | 1800-01-01 | ...
...
VISIT ID | CLASFPRIO | CLASFCD | CLASFTYPE
12345678 | 01        | ###.##  | DF
12345678 | 02        | ###.##  | DF
12345678 | 03        | ###.##  | DF
A.VISIT ID | B.CLASFCD_1 | B.CLASFCD_2 | B.CLASFCD_2
12345678   | ###.##      | ###.##      | ###.##
...
表B如下所示:

VISIT ID | ADM_DATE   | ...
12345678 | 1800-01-01 | ...
...
VISIT ID | CLASFPRIO | CLASFCD | CLASFTYPE
12345678 | 01        | ###.##  | DF
12345678 | 02        | ###.##  | DF
12345678 | 03        | ###.##  | DF
A.VISIT ID | B.CLASFCD_1 | B.CLASFCD_2 | B.CLASFCD_2
12345678   | ###.##      | ###.##      | ###.##
...
我试图实现的输出如下所示:

VISIT ID | ADM_DATE   | ...
12345678 | 1800-01-01 | ...
...
VISIT ID | CLASFPRIO | CLASFCD | CLASFTYPE
12345678 | 01        | ###.##  | DF
12345678 | 02        | ###.##  | DF
12345678 | 03        | ###.##  | DF
A.VISIT ID | B.CLASFCD_1 | B.CLASFCD_2 | B.CLASFCD_2
12345678   | ###.##      | ###.##      | ###.##
...
表A中的列是我在where子句中设置的条件,表B也是。以下是我目前正在尝试的,有效,只是代码太多了:

DECLARE @SD DATETIME;
DECLARE @ED DATETIME;
DECLARE @CP_1 INT;
DECLARE @CP_2 INT;
DECLARE @CP_3 INT;
DECLARE @SCT VARCHAR(10);

SET @SD = '2014-01-01';
SET @ED = '2014-02-01';
SET @CP_1 = 1;
SET @CP_2 = 2;
SET @CP_3 = 3;
SET @SCT = 'DF';


DECLARE @ICD9_1 TABLE (
PtNo_Num VARCHAR(20)
, ICD_1 VARCHAR(10)
)

INSERT INTO @ICD9_1
SELECT B.PtNo_Num
, B.CLASFCD_1

FROM (
SELECT DISTINCT PtNo_Num,
ClasfCd AS CLASFCD_1

FROM smsdss.BMH_PLM_PtAcct_Clasf_Dx_V

WHERE ClasfPrio = @CP_1
AND SortClasfType = @SCT
) B

--SELECT * FROM @ICD9_1

-----------------------------------------------------------------------
DECLARE @ICD9_2 TABLE (
PtNo_Num VARCHAR(20)
, ICD_2 VARCHAR(10)
)

INSERT INTO @ICD9_2
SELECT C.PtNo_Num
, C.CLASFCD_2

FROM (
SELECT DISTINCT PtNo_Num,
ClasfCd AS CLASFCD_2

FROM smsdss.BMH_PLM_PtAcct_Clasf_Dx_V

WHERE ClasfPrio = @CP_2
AND SortClasfType = @SCT
) C

--SELECT * FROM @ICD9_2

-----------------------------------------------------------------------
DECLARE @ICD9_3 TABLE (
PtNo_Num VARCHAR(20)
, ICD_3 VARCHAR(10)
)

INSERT INTO @ICD9_3
SELECT D.PtNo_Num
, D.CLASFCD_3

FROM (
SELECT DISTINCT PtNo_Num,
ClasfCd AS CLASFCD_3

FROM smsdss.BMH_PLM_PtAcct_Clasf_Dx_V

WHERE ClasfPrio = @CP_3
AND SortClasfType = @SCT
) D

--SELECT * FROM @ICD9_3

-----------------------------------------------------------------------
DECLARE @ICD9F TABLE(
PTNO_NUM VARCHAR(20)
, ICD9_1 VARCHAR(10)
, ICD9_2 VARCHAR(10)
, ICD9_3 VARCHAR(10)
)

INSERT INTO @ICD9F
SELECT
E.PTNO_NUM
, E.ICD9_1
, E.ICD9_2
, E.ICD9_3

FROM (

SELECT PV.PtNo_Num
, ICD9_1.ICD_1 AS ICD9_1
, ICD9_2.ICD_2 AS ICD9_2
, ICD9_3.ICD_3 AS ICD9_3

FROM smsdss.BMH_PLM_PtAcct_V PV
JOIN @ICD9_1 ICD9_1
ON PV.PtNo_Num = ICD9_1.PtNo_Num
JOIN @ICD9_2 ICD9_2
ON PV.PtNo_Num = ICD9_2.PtNo_Num
JOIN @ICD9_3 ICD9_3
ON PV.PtNo_Num = ICD9_3.PtNo_Num

WHERE PV.Adm_Date >= @SD
AND PV.Adm_Date < @ED
AND PV.Plm_Pt_Acct_Type = 'I'
AND PV.PtNo_Num < '20000000'
) E

SELECT * FROM @ICD9F
虽然这是可行的,但代码太多了,确实有点让人困惑,所以我将问题改为优化查询

更新:CLASFCD可以是字母数字的,也可以按照@隐喻的建议将代码更新为我现在使用的代码

谢谢你,

试试下面这句话:

select 
    VisitID,
    sum(case when classfprio = '01' then classfcd else 0 end) as ClassFCD1,
    sum(case when classfprio = '02' then classfcd else 0 end) as ClassFCD2,
    sum(case when classfprio = '03' then classfcd else 0 end) as ClassFCD3
from TableA a
join TableB b on b.VisitID = a.VisitID
group by VisitID, ClassFPrio

早上我会尝试一下,谢谢,有趣的思考方式。这不起作用,我没有意识到ClasfCD可以是字母数字,我将投票支持这项工作并解决我的问题。是的,这是交叉表的要求,列需要是聚合。现在我正试图创建三个表,每个clasfcd一个,然后创建一个第四个,这似乎是可行的,只是代码太多了。