【发布时间】:2015-01-12 06:47:25
【问题描述】:
我正在尝试生成一份报告,以显示哪些用户被限制在特定设施中。我使用的基本代码是:
`SELECT DISTINCT ppp.DeptID,
mis.UserID,
mis.[Name],
CASE
WHEN mis.ProviderID IS NULL
THEN 'No'
ELSE 'YES'
END AS 'IsProv',
CASE
WHEN af.FacilityID = 'PSY'
THEN 'Restricted'
ELSE 'Not Restricted'
END AS 'SignOnFacility',
CASE
WHEN fr.FacilitiesRestrictedID = 'PSY'
THEN 'Restricted'
ELSE 'Not Restricted'
END AS 'FacilityToRestrict',
mis.Active
FROM DMisUsers mis
LEFT JOIN DMisUserRestrictedAdmMriFac fr
ON mis.UserID = fr.UserID
AND mis.SourceID = fr.SourceID
LEFT JOIN DMisUserAdmMriFacility af
ON af.UserID = mis.UserID
INNER JOIN PpEmployees pe
ON mis.SourceID = pe.SourceID
AND mis.UserID = pe.UserID
INNER JOIN PpPayrollPosition ppp
ON ppp.EmployeeID = pe.EmployeeID
AND pe.SourceID = ppp.SourceID
WHERE mis.SourceID = 'STP'
AND mis.Active = 'Y'`
这会产生以下结果集,该结果集为每个“设施”列带来一行。
| DeptID | UserID |IsProv| SignOnFacility | FacilityToRestrict | Active|
|01.9030 | PPaul | No | Not Restricted | Not Restricted | Y |
|01.9030 | PPaul | No | Not Restricted | Restricted | Y |
我想要做的是得到一个像这样的单行:
| DeptID | UserID |IsProv| SignOnFacility | FacilityToRestrict | Active|
|01.9030 | PPaul | No | Not Restricted | Restricted | Y |
我尝试过 CTE、使用 Row_Number() 绕过聚合的枢轴以及其他几种方法。任何帮助将不胜感激。
【问题讨论】:
-
什么决定保留/删除哪一行?
-
问题出在 FacilityToRestrict 上。如果您摆脱了该列,那么您的“DISTINCT”将负责其余的工作。那么问题来了,为什么 FacilityToRestrict 会为同一个用户返回不同的值?
-
您能否提供以下查询的输出:SELECT * FROM DMisUserRestrictedAdmMriFac WHERE UserID = 'PPaul' and Source = 'STP'?谢谢。
-
FacilityToRestrict 可以而且经常确实有多个设施 ID。 @Michael 的输出显示要限制 14 种不同的设施。 SignOnFacility 和 FacilitiesToRestric 都可以有多个值,但我只关心它们中的 PSY 值。