CASE 问题,还是我加入 table 的方式

CASE issue, or is it how I've joined my table

在 Yellowfin 中想要 return 一个值,我有 3 个表叫 会员资格, 会员计划, 会员UDP。

成员是主成员,与其他两个成员有外连接(link 可能存在也可能不存在)

所以如果 MemberPlans.PrevFundID 有一个我想要的条目, 否则如果他们加入不到 3 个月前我想要 MembershipUDPs.Property 否则我想要一个文本短语。

目前我每个 memberships.MemberNo 得到 2 行,一行显示 PRevFundID,另一行显示 MembershipsUDP,我只想要一行: 显示的 sql 是通过 Yellowfin

生成的
    SELECT DISTINCT
      "Memberships"."MemberNo",
      CASE
        WHEN PrevFundID IS NOT NULL  THEN PrevFundID
     ELSE 
       CASE
          WHEN JOINDATE >= DATEADD(mm, -3, GETDATE()) THEN Property 
          ELSE 'New to PHI'
       END
     END,
     "MembershipPlans"."PrevFundID",
     "MembershipUDPs"."Property"
   FROM "dbo"."Memberships"
   LEFT OUTER JOIN "dbo"."MembershipPlans"
     ON ("Memberships"."MemberNo" = "MembershipPlans"."MemberNo")
   LEFT OUTER JOIN "dbo"."MembershipUDPs"
     ON ("Memberships"."MemberNo" = "MembershipUDPs"."MemberNo")
    AND ("MembershipUDPs"."PropertyID" = N'TF')
   WHERE ("Memberships"."IsProspect" = N'N')
     AND ("Memberships"."JoinDate" BETWEEN '20140701 00:00:00.0' AND
                                           '20150630 23:59:59.997'
          AND ("Memberships"."PaidToDate" >= "Memberships"."JoinDate"
           OR "Memberships"."TermDate" IS NULL)
         )

我在收到关于完整代码的评论后编辑了这个

LEFT OUTER JOIN 链导致了这里的问题。您需要 MembershipPlans table MembershipUDPS table 中的 行,但不能同时使用这两个行。 SQL 中也有一些无关的条件;你不需要两个 case 语句,括号可能会绊倒你(事实上他们可能会绊倒 me,这段代码有点难以阅读)。

试试这个:

SELECT DISTINCT
   "Memberships"."MemberNo",
    CASE
      WHEN PrevFundID IS NOT NULL  THEN PrevFundID
      WHEN JOINDATE >= DATEADD(mm, -3, GETDATE()) THEN Property 
      ELSE 'New to PHI' 
    END,
   "MembershipPlans"."PrevFundID",
   NULL
FROM "dbo"."Memberships"
INNER JOIN "dbo"."MembershipPlans"
ON "Memberships"."MemberNo" = "MembershipPlans"."MemberNo"
WHERE "Memberships"."IsProspect" = N'N'
AND "Memberships"."JoinDate" BETWEEN '20140701 00:00:00.0' AND '20150630 23:59:59.997'
AND ("Memberships"."PaidToDate" >= "Memberships"."JoinDate"
      OR "Memberships"."TermDate" IS NULL)
UNION ALL
SELECT DISTINCT
   "Memberships"."MemberNo",
    CASE
      WHEN PrevFundID IS NOT NULL  THEN PrevFundID
      WHEN JOINDATE >= DATEADD(mm, -3, GETDATE()) THEN Property 
      ELSE 'New to PHI' 
    END,
   NULL,
   "MembershipUDPs"."Property",
FROM "dbo"."Memberships"
INNER JOIN "dbo"."MembershipUDPs"
ON "Memberships"."MemberNo" = "MembershipUDPs"."MemberNo"
WHERE "Memberships"."IsProspect" = N'N'
AND "Memberships"."JoinDate" BETWEEN '20140701 00:00:00.0' AND '20150630 23:59:59.997'
AND ("Memberships"."PaidToDate" >= "Memberships"."JoinDate"
      OR "Memberships"."TermDate" IS NULL)

如果你想要相同的column,那么把投影列表中的NULLs去掉(查询顶部的SELECT ...NULL)。

嗨,我最终解决了这个问题。我使用外连接的原因是因为表之间的关系是 none 到很多,但我使用子查询重写了查询。 SQL 的格式是通过 Yellowin 创建的:

SELECT 
   T0.C0,
   T1.C0,
   T2.C0,
   CASE
      WHEN T1.C0 IS NULL
      AND T2.C0 IS NULL THEN 1
   END,
   CASE
      WHEN T2.C0 = 'NM' THEN 'New to PHI'
      WHEN T1.C0 IS NOT NULL
      OR T2.C0 IS NOT NULL THEN 'Transferred'
      ELSE 'New to PHI'
   END,
   T0.C1
FROM (
   SELECT DISTINCT
      "Memberships"."MemberNo" AS C0,
      COUNT("Memberships"."MemberNo") AS C1
   FROM "dbo"."Memberships"
   WHERE (
      "Memberships"."IsProspect" = N'N'
   )
   AND (
      (
         "Memberships"."PaidToDate" > "Memberships"."JoinDate"
         OR "Memberships"."HealthTermEntryDate" IS NULL
      )
      AND "Memberships"."JoinDate" BETWEEN '20150701 00:00:00.0' AND '20160630 23:59:59.997'
   )
   GROUP BY 
      "Memberships"."MemberNo"

) T0
LEFT OUTER JOIN (
   SELECT DISTINCT
      "MembershipPlans"."PrevFundID" AS C0,
      "Memberships"."MemberNo" AS C1
   FROM "dbo"."Memberships"
   INNER JOIN "dbo"."MembershipPlans"
   ON (
      "Memberships"."MemberNo" = "MembershipPlans"."MemberNo"
   )
   WHERE (
      "Memberships"."IsProspect" = N'N'
   )
   AND (
      "MembershipPlans"."IsPrevCover" IN (N'Y')
   )

) T1
ON T0.C0 = T1.C1
LEFT OUTER JOIN (
   SELECT DISTINCT
      "MembershipUDPs"."Property" AS C0,
      "MembershipUDPs"."MemberNo" AS C1
   FROM "dbo"."Memberships"
   LEFT OUTER JOIN "dbo"."MembershipUDPs"
   ON (
      "Memberships"."MemberNo" = "MembershipUDPs"."MemberNo"
   )
   WHERE (
      "Memberships"."IsProspect" = N'N'
   )
   AND (
      "MembershipUDPs"."PropertyID" IN (N'TF   ')
      AND "Memberships"."JoinDate" >= '20150608 00:00:00.0'
   )

) T2
ON T0.C0 = T2.C1