【问题标题】:non duplicate multiple SQL records I can't get rid of非重复的多个 SQL 记录我无法摆脱
【发布时间】: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 值。

标签: sql tsql pivot ssms


【解决方案1】:

我很确定你想要group by。这是我对逻辑的猜测:

SELECT ppp.DeptID, mis.UserID, mis.[Name],
       COALESCE(MAX(CASE WHEN mis.ProviderID IS NOT NULL THEN 'YES' END), 'NO') as IsProv,
       COALESCE(MAX(CASE WHEN af.FacilityID <> 'PSY' THEN 'Not Restricted' END), 'Restricted') as SIgnOnFacility,
       COALESCE(MAX(CASE WHEN fr.FacilitiesRestrictedID <> 'PSY' THEN 'Not Restricted' END) as FacilityToRestrict,
        mis.Active
FROM . . .
GROUP BY ppp.DeptID, mis.UserID, mis.[Name], mis_Active;

【讨论】:

  • 我不得不对其进行小幅编辑,但它基本上成功了。谢谢!我总是忘记合并,只是没有尽可能多地使用它。
猜你喜欢
  • 1970-01-01
  • 2015-04-06
  • 2014-03-28
  • 2014-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
相关资源
最近更新 更多