SQL Server加入
我当前处理的查询返回所需的结果,但问题是我必须为我要添加的每个额外列创建一个具有不同TaskCounters的附加联接(当然这不是一个理性的决定) 查询应该在SQLServer和Access数据库上运行,因此我不需要Access中不支持的任何特殊功能(如Pivot、CTE等)。我需要修改该查询,以便尽可能减少联接的数量 tblConsultations是主表,其中根据就诊类型记录特定儿童的条目(即,如果我们有4次就诊,我们有4次就诊条目)。结果列应显示这4次访问的值,如果没有访问的值,则显示NULL 我想消除对同一个表的额外连接的需要,我必须为每一个附加列添加该表 查询如下:SQL Server加入,sql,sql-server,ms-access,Sql,Sql Server,Ms Access,我当前处理的查询返回所需的结果,但问题是我必须为我要添加的每个额外列创建一个具有不同TaskCounters的附加联接(当然这不是一个理性的决定) 查询应该在SQLServer和Access数据库上运行,因此我不需要Access中不支持的任何特殊功能(如Pivot、CTE等)。我需要修改该查询,以便尽可能减少联接的数量 tblConsultations是主表,其中根据就诊类型记录特定儿童的条目(即,如果我们有4次就诊,我们有4次就诊条目)。结果列应显示这4次访问的值,如果没有访问的值,则显示NU
SELECT Cast(SUBSTRING(tc2.ChildCounter, 7, LEN(tc2.ChildCounter)) AS NUMERIC) AS pkChildID
,tc2.VisitType
,tblQuitOffered.Result AS KWA_QuitOffered
,tblQuitReferral.Result As KWA_QuitReferral
FROM tblConsultations tc2
INNER JOIN tblChild tc ON tc2.ChildCounter = tc.ChildCounter
LEFT JOIN tblDelivery td ON td.ChildCounter = tc.ChildCounter
LEFT JOIN (
SELECT ttr.ResultCounter
,ttr.ChildCounter
,tkt.VisitType
,ttr.Result
,ttr.TaskCounter
FROM tblTaskResults ttr
INNER JOIN tlkpKeyTasks tkt ON tkt.TaskCounter = ttr.TaskCounter
AND tkt.TaskCounter IN (
'001410'
,'001463'
,'001431'
)
) AS tblQuitOffered ON tc2.VisitType = tblQuitOffered.VisitType
AND tblQuitOffered.ChildCounter = tc2.ChildCounter
LEFT JOIN (
SELECT ttr.ChildCounter
,tkt.VisitType
,ttr.Result
FROM tblTaskResults ttr
INNER JOIN tlkpKeyTasks tkt ON tkt.TaskCounter = ttr.TaskCounter
AND tkt.TaskCounter IN (
'001411'
,'001464'
,'001432'
)
) AS tblQuitReferral ON tc2.VisitType = tblQuitReferral.VisitType
AND tblQuitReferral.ChildCounter = tc2.ChildCounter
WHERE tc2.VisitType in (1, 2, 3, 4)
AND tc2.ConsDate BETWEEN '20130127' and '20130228'
ORDER BY tc2.ChildCounter,tc2.VisitType
pkChildID VisitType KWA_QuitOffered KWA_QuitReferral
2224 1 No No
2224 3 NULL NULL
2224 4 NULL NULL
2225 1 No Yes
2225 2 Yes Yes
2225 3 Yes Yes
2225 4 NULL NULL
结果如下:
SELECT Cast(SUBSTRING(tc2.ChildCounter, 7, LEN(tc2.ChildCounter)) AS NUMERIC) AS pkChildID
,tc2.VisitType
,tblQuitOffered.Result AS KWA_QuitOffered
,tblQuitReferral.Result As KWA_QuitReferral
FROM tblConsultations tc2
INNER JOIN tblChild tc ON tc2.ChildCounter = tc.ChildCounter
LEFT JOIN tblDelivery td ON td.ChildCounter = tc.ChildCounter
LEFT JOIN (
SELECT ttr.ResultCounter
,ttr.ChildCounter
,tkt.VisitType
,ttr.Result
,ttr.TaskCounter
FROM tblTaskResults ttr
INNER JOIN tlkpKeyTasks tkt ON tkt.TaskCounter = ttr.TaskCounter
AND tkt.TaskCounter IN (
'001410'
,'001463'
,'001431'
)
) AS tblQuitOffered ON tc2.VisitType = tblQuitOffered.VisitType
AND tblQuitOffered.ChildCounter = tc2.ChildCounter
LEFT JOIN (
SELECT ttr.ChildCounter
,tkt.VisitType
,ttr.Result
FROM tblTaskResults ttr
INNER JOIN tlkpKeyTasks tkt ON tkt.TaskCounter = ttr.TaskCounter
AND tkt.TaskCounter IN (
'001411'
,'001464'
,'001432'
)
) AS tblQuitReferral ON tc2.VisitType = tblQuitReferral.VisitType
AND tblQuitReferral.ChildCounter = tc2.ChildCounter
WHERE tc2.VisitType in (1, 2, 3, 4)
AND tc2.ConsDate BETWEEN '20130127' and '20130228'
ORDER BY tc2.ChildCounter,tc2.VisitType
pkChildID VisitType KWA_QuitOffered KWA_QuitReferral
2224 1 No No
2224 3 NULL NULL
2224 4 NULL NULL
2225 1 No Yes
2225 2 Yes Yes
2225 3 Yes Yes
2225 4 NULL NULL
如果我理解正确,您可以在单个派生表中包含所需的所有
TaskCounter
值,然后使用CASE
语句分配列值:
SELECT Cast(SUBSTRING(tc2.ChildCounter, 7, LEN(tc2.ChildCounter))
AS NUMERIC) AS pkChildID
,tc2.VisitType
,MAX(CASE WHEN tktResults.TaskCounter IN (
'001410'
,'001463'
,'001431'
) THEN tktResults.Result END
) AS KWA_QuitOffered
,MAX(CASE WHEN tktResults.TaskCounter IN (
'001411'
,'001464'
,'001432'
) THEN tktResults.Result END
) AS KWA_QuitReferral
FROM tblConsultations tc2
INNER JOIN tblChild tc
ON tc2.ChildCounter = tc.ChildCounter
LEFT JOIN tblDelivery td
ON td.ChildCounter = tc.ChildCounter
LEFT JOIN (
SELECT ttr.ResultCounter
,ttr.ChildCounter
,tkt.VisitType
,ttr.Result
,ttr.TaskCounter
FROM tblTaskResults ttr
INNER JOIN tlkpKeyTasks tkt
ON tkt.TaskCounter = ttr.TaskCounter
AND tkt.TaskCounter IN (
'001410'
,'001463'
,'001431'
,'001411'
,'001464'
,'001432'
)
) AS tktResults
ON tktResults.VisitType = tc2.VisitType
AND tktResults.ChildCounter = tc2.ChildCounter
WHERE tc2.VisitType in (1, 2, 3, 4)
AND tc2.ConsDate BETWEEN '20130127' and '20130228'
GROUP BY 1, 2
ORDER BY tc2.ChildCounter,tc2.VisitType
事实上,您并不需要将其作为派生表(左连接(…)部分),但我假设您这样做是出于性能原因。当您根据任务计数器的不同值添加列时,只需将它们添加到联接条件中即可
编辑:修改为使用带有MAX
函数的groupby
子句,通过pkChildID
和VisitType
返回唯一行
我在groupby
子句中使用了“ordered list”样式;如果不支持,您可能需要如下指定:
GROUP BY Cast(SUBSTRING(tc2.ChildCounter, 7, LEN(tc2.ChildCounter)) AS NUMERIC)
,tc2.VisitType
Code QuitOffered QuitReferral
001410 1 Null
001462 1 Null
001431 1 Null
001411 Null 1
001464 Null 1
001432 Null 1
我还注意到您正在按一列排序,该列不是SELECT子句的一部分。我不知道为什么,但还是原封不动。我发布了一个答案,有人认为这与BellevueBob发布的答案类似
我认为可以使用嵌套的iif()而不是“case-when”
在SQL中,创建一个新表通常可以解决一个问题。我们称之为coderesolve
看起来是这样的:
GROUP BY Cast(SUBSTRING(tc2.ChildCounter, 7, LEN(tc2.ChildCounter)) AS NUMERIC)
,tc2.VisitType
Code QuitOffered QuitReferral
001410 1 Null
001462 1 Null
001431 1 Null
001411 Null 1
001464 Null 1
001432 Null 1
您可以为要执行的每个“新”联接添加更多列
那么您的代码如下所示
SELECT
Cast(SUBSTRING(tc2.ChildCounter, 7, LEN(tc2.ChildCounter)) AS NUMERIC)
AS pkChildID
,tc2.VisitType
,ttr.Result AS KWA_QuitOffered
,ttr.Result As KWA_QuitReferral
FROM tblConsultations tc2
INNER JOIN tblChild tc ON tc2.ChildCounter = tc.ChildCounter
LEFT JOIN tblDelivery td ON td.ChildCounter = tc.ChildCounter
JOIN tblTaskResults ttr on tc2.VisitType = ttr.VisitType
JOIN tlkpKeyTasks tkt ON tkt.TaskCounter = ttr.TaskCounter
JOIN coderesolve cr on cr.code = tkt.TaskCounter
AND COALESCE(cr.QuitOffered,cr.QuitReferral,0) = 1
WHERE tc2.VisitType in (1, 2, 3, 4)
AND tc2.ConsDate BETWEEN '20130127' and '20130228'
ORDER BY tc2.ChildCounter,tc2.VisitType
这应该适用于访问。但是访问很有趣,所以没有承诺
另一个注意事项是,我假设您的代码是互斥的(在coderesolve连接上只提供一行结果),如果不是这样,您可能必须将其分解为子查询,并根据您的模型进行分组或区分;但我认为可以使用VBA。我错过了关于拥有包含MS Access的便携式解决方案的部分。我自己在“真正”的工作中不太使用Access。困难的是sql server和ms Access之间的可移植性,不幸的是,它们在函数和联接方面没有相同的语法。MS Access需要在多个表联接周围加括号。您好BellevueBob,您的回答与我的要求非常接近,只是现在我看到每个pkChildID对应两条记录,而不是一条。为了进一步说明,早些时候我在结果集中有7条记录(儿童4种就诊类型(2225)和儿童3种就诊类型(2224)),但现在它向我显示了11条记录。区别就像我之前通过以下方式得到的结果集:pkChildID访问类型KWA_QuitOffered KWA_QuitReferral 2224 1否,但现在它变成了pkChildID访问类型KWA_QuitOffered KWA_QuitReferral 2224 1否NULL 2224 1 NULL No please Help web搜索还向我显示了开关
功能,该功能也可以用于访问,但遗憾的是,我认为这两种功能在SQL Server中都不起作用。取决于SQL ServerIIF
的版本可能不受支持。它是在SQL Server 2012中提供的。哦,我明白了。你想要一些既能使用SQL又能使用Ms Access的东西……是的,你说得对,BellevueBob……到目前为止,我还没有尝试过SQL 2012,但我可以告诉你……如果你能通过某种方式动态检测到你正在使用的数据中心……也许你可以替换你的查询……嗯?我认为你找不到一个令人满意的答案,将与SQL Server和MS Access一起使用。正如bluefeet提到的,SQL语法本身是不同的。每个环境可能需要不同的解决方案。@BellevueBob我不同意,看起来AMS需要的只是GROUP BY子句。但对我来说,一个谜是如何使用TaskCounter来确定报价和报价。@BellevueBob-我相信我找到了答案:D