【问题标题】:CASE WHEN Statement with two tables with table 2 column referencing has non-unique valueCASE WHEN 带有两个表且表 2 列引用的语句具有非唯一值
【发布时间】:2021-10-21 06:51:16
【问题描述】:

我处理过一个查询,但只有一个部分让我感到不适。我正在尝试根据两个表的值在查询中创建一个列。我已经尝试过 CASE WHEN 并且它起作用,但是由于涉及的非唯一值,原始查询之间的查询中的行数没有增加。例如,我写的就是这种情况:

   Select  r.Id,
        r.RequiredOn AT TIME ZONE 'UTC' AT TIME ZONE 'Central Standard Time' 
               as RequiredDate,
        Concat(vs.Salutation, ' ',vs.FirstName, ' ', vs.LastName) as Name,
        oo.Name as RequestingOrganization,
        o.Name as Location,
        Case
            When r.IntendedOutcome = '1' Then 'T'
            When r.IntendedOutcome = '2' Then 'R'
        End as RequestType,
        etr.TypeRequested,
        Case
            When etr.Identifier is not null then etr.Identifier
            When etr.Identifier is null then ' '
        End as Identifier,
        f.OfferedOn,
        f.OfferResponse,
        r.DestinationCountryCodes,
        o.Id,
        CASE
            WHEN o.Id = oir.OrganizationId AND oir.OrganizationRoleId = 
                  'de51c814-f86d-49c9-941b-999a98be4894'
            THEN 1
            ELSE NULL
       END AS Bk1

        From [Request] r
            Left Join Recovered etr
            on etr.DistributionRequestId = r.Id      
        
            Left Join [Offer] f
                on f.Id = etr.Id
        
                Left Join [dbo].Contact vs
                    on vs.Id = r.SId

                        Left Join [dbo].Organization o
                            on o.Id = r.SLocationId or o.Id = r.RLocationId

                                Left Join [dbo].Organization oo
                                    on oo.Id = r.RequestingOrganizationId

                                    Left Join dbo.OrganizationInRole oir
                                        on oir.OrganizationId = o.Id

                       Where f.Response = 'Accepted' or f.Response is NULL

图片显示该表的OrganizationId 不是唯一的,因此当匹配OrganizationId 并找到OrganizationRoleId 时,它会将所有OrganizationRoleId 带入查询中并添加到其中,而不是仅仅看到它有特定的角色 ID 并添加到我需要的一行。

“组织角色”列不唯一,每个组织都可以有多个角色(有时是 4-5 个)。我需要如果 OrganizationId 是 A 并且表 2 中匹配的 OrganizationId 在 OrganizationRole 列中具有标识符,则添加 1。

Organization 表(表 2)有一个 OrganizationId 列和一个 OrganizationRole 列。 OrganizationId 不是唯一的,因为 OrgnanizationId 可以连续使用 5 行,因为该组织有 5 个角色。

我得到的结果是查询正在从与该表匹配的组织中提取所有角色。与原始查询相比,它基本上增加了 33% 的行。

【问题讨论】:

  • 我无法完全理解这个问题。你能添加几行样本数据和预期的结果吗?请仅包括相关的列。一个最小的例子就可以了。
  • edit您的问题包括示例数据和您试图获得的结果,以及您正在使用的完整 SQL(而不仅仅是脱离上下文的部分) .见Why should I provide a Minimal Reproducible Example for a very simple SQL query?
  • 听起来您可能需要通过子查询或应用/横向连接以某种方式预先聚合您的数据。很难理解您的意思,因此一组说明您的问题和所需结果的示例数据将大有帮助。并标记您的特定数据库。

标签: sql


【解决方案1】:

当你说

...如果OrganizationId 为A,并且表2 中匹配的OrganizationId 在OrganizationRole 列中具有标识符,则添加1。

如果此条件为真,您是否要创建数字计数?如果是这样,您需要将您的 CASE 包装在一个聚合函数中并在其他行上分组。

或者,正如 Stu 在 cmets 中建议的那样,您可以预先聚合 OrganizationInRole 表,过滤出您真正感兴趣的角色;像

SELECT r.Id,
...
   oir.RoleCount AS Bk1

FROM [Request] r
    ...
    LEFT JOIN [dbo].Organization o 
        ON o.Id = r.SLocationId or o.Id = r.RLocationId
    ...
    LEFT JOIN (
        SELECT OrganizationId, COUNT(*) AS RoleCount
        FROM dbo.OrganizationInRole
        WHERE OrganizationRoleId = 'de51c814-f86d-49c9-941b-999a98be4894'
        GROUP BY OrganizationId) AS oir ON oir.OrganizationId = o.Id
 ...

您可以对具有多个相关行的任何其他表执行此操作,将它们减少为要加入的单行,并且无需在主查询中进行聚合和分组。

【讨论】:

  • 嗨托尼,我不想要一个计数,但如果从技术上讲,如果组织具有与该 RoleIdentifier 匹配的 RoleId,那么它只会是 1。下面是我试图做的解释用伪代码实现:
  • 检查哪里 'Table 1'[OrganizationId]' = 'Table 2'[OrganizationId],如果 WHERE 'Table 1'[OrganizationId] = 'Table 2'[OrganizationId] 有一个'Table 2' [OrganizationRoleId] = 'de51c814-f86d-49c9-941b-999a98be4894', THEN 'TRUE' ELSE 'FALSE'
  • 问题在于,还有其他的 OrganizationRoleId 不是 'de51c814-f86d-49c9-941b-999a98be4894',但 OrganizationId 仍然匹配。对于 Table1 中与 Table2 中的 OrganizationRoleId 匹配的行,它还会带来其他不匹配的 OrganizationRoleId 并将行添加到查询中
  • Tony,我尝试了你和 Stu 建议的预聚合,没有添加任何行,到目前为止看起来很有希望。我将梳理数据以确认一切,但谢谢。我很感激。
  • @Buckets - 如果您可以提供表之间的关系,显示存在一对多或多对多链接的位置,以及一些示例数据,这将有助于我理解更多你想要做的事情。如果您不计算特定角色的实例数,并且一个组织可以有许多角色,那么您将在结果中获得多行,除非您进行一些聚合。很高兴知道您是否设法解决它:)
猜你喜欢
  • 2012-04-29
  • 2013-01-05
  • 2011-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-07
  • 1970-01-01
相关资源
最近更新 更多