【发布时间】:2013-03-21 15:50:04
【问题描述】:
我有一个查询使用两个SELECT 语句,它们使用UNION ALL 组合在一起。这两个语句都从相似的表中提取数据以填充查询结果。我正在尝试从查询中删除“半重复”行,但这样做时遇到问题。
我的查询如下:
SELECT DISTINCT *
FROM
(
SELECT
TeamNum = CASE
WHEN T.TeamName = 'Alpha Team'
THEN '1'
WHEN T.TeamName IN ('Bravo Team', 'Charlie Team')
THEN '2'
WHEN T.TeamName = 'Delta Team'
THEN '3'
ELSE '<Undefined>'
END,
P.PatientLastName AS LastName,
P.PatientFirstName AS FirstName,
R.PrimaryCity AS City,
ReimbursorName = CASE
WHEN RE.ReimbursorDescription = 'Medicare'
Then 'R1'
WHEN RE.ReimbursorDescription = 'Medicaid'
Then 'R2'
ELSE 'R3'
END,
P.PatientID AS PatientID
FROM
PatReferrals PR LEFT JOIN Patient P ON PR.PatientID = P.PatientID,
Patient P LEFT OUTER JOIN Rolodex R ON P.RolodexID = R.RolodexID,
PatReferrals PR LEFT OUTER JOIN PatReimbursors PRE ON PR.PatientID = PRE.PatientID,
PatReimbursors PRE LEFT OUTER JOIN Reimbursors RE ON PRE.ReimbursorID = RE.ReimbursorID,
PatReferrals PR FULL OUTER JOIN Teams T ON PR.TeamID = T.TeamID,
WHERE
PR.ReferralDate BETWEEN GETDATE()-4 AND GETDATE()-1
AND PR.Status <> 'R'
AND PRE.CoveragePriority = '1'
AND PRE.ExpirationDate IS NULL
UNION ALL
SELECT
TeamNum = CASE
WHEN T.TeamName = 'Alpha Team'
THEN '1'
WHEN T.TeamName IN ('Bravo Team', 'Charlie Team')
THEN '2'
WHEN T.TeamName = 'Delta Team'
THEN '3'
ELSE '<Undefined>'
END,
P.PatientLastName AS LastName,
P.PatientFirstName AS FirstName,
R.PrimaryCity AS City,
ReimbursorName = CASE
WHEN RE.ReimbursorDescription = 'Medicare'
Then 'E1'
WHEN RE.ReimbursorDescription = 'Medicaid'
Then 'E2'
ELSE 'E3'
END,
P.PatientID AS PatientID
FROM
PatReferrals PR LEFT JOIN Patient P ON PR.PatientID = P.PatientID,
Patient P LEFT OUTER JOIN Rolodex R ON P.RolodexID = R.RolodexID,
PatReferrals PR LEFT OUTER JOIN PatEligibilities PE ON PR.PatientID = PE.PatientID,
PatEligibilities PE LEFT OUTER JOIN Reimbursors RE ON PE.ReimbursorID = RE.ReimbursorID,
PatReferrals PR FULL OUTER JOIN Teams T ON PR.TeamID = T.TeamID,
WHERE
PR.ReferralDate BETWEEN GETDATE()-4 AND GETDATE()-1
AND PR.Status <> 'R'
AND PE.Status <> 'V'
AND PE.ApplicationDate BETWEEN DATE(PR.ReferralDate)-5 AND DATE('2100/01/01')
)
AS DUMMYTBL
ORDER BY
DUMMYTBL.LastName ASC,
DUMMYTBL.FirstName ASC
我在运行查询时收到的结果如下:
3 Doe Jane Town R1 19874
1 Roe John City R3 50016
1 Roe John City E1 50016
2 Smith Jane Town E3 33975
一旦从原始查询中引入结果,我需要删除的数据是基于特定条件的重复行。每个人只能列出一次,并且他们必须有一个支付来源(R1、R2、R3、E1、E2、E3)。如果有 R#,则不能为该人列出 E#。如果没有 R#,则必须列出 E#。如我的示例结果所示,第 2 行和第 3 行列出了同一个人,但有两个支付来源(R3 和 E1)。
如何使用我列出的标准让每个人只显示一行?
编辑:修改了 SQL 查询以显示来自 WHERE 子句的原始变量,以便显示查询的更多详细信息。 PatReimbursors 和 PatEligibilities 表具有相似的数据,但为了提取正确的数据,标准不同。
【问题讨论】:
-
TeamNum = T.TeamName,?是不是打错字了? -
这真的是一个有效的查询吗?
from子句似乎多次出现相同的别名 - 看起来好像永远无法运行。另外,如果有多个“R”源,哪个优先? -
@Rachcha - 我缩短了查询的那部分,因为它最初是一个
CASE语句以从TeamName返回数字。 @Mark Bannister - 是的,这个查询确实有效。
标签: sql sybase duplicate-removal sybase-asa