2015-09-03 19 views
0

在Yellowfin想要返回一個值,我有3個表稱爲 成員資格, membershipPlans, membershipUDP。CASE問題,或者它是如何我已經加入我的表

會員是最主要的一個與外連接到其他兩個(鏈接可能會或可能不存在)

所以如果MemberPlans.PrevFundID有我想要的條目, 否則,如果他們加入小於3個月之前我想MembershipUDPs.Property 否則我想要一個文本短語。

目前我得到2行每memberships.MemberNo,一個顯示PRevFundID和另一個顯示MembershipsUDPs,我只想一排: 顯示的SQL是通過黃鰭

產生
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) 
     ) 

我編輯在此之後收到關於完整代碼的評論

+0

除非您顯示完整查詢,否則很難回答。 –

+0

這種情況表達式只能返回一個值,所以如果你得到多行,那麼其他的東西就是原因。請顯示整個查詢。 – jpw

+0

現在顯示完整代碼 – Chris

回答

1

嗨,我最終解決了這個問題。我使用外連接的原因是因爲表之間的關係不是很多,而是使用子查詢重寫了查詢。 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 
1

左側外部連接鏈在這裏引起問題。您想從MembershipPlans表 MembershipUDPS表中選擇行,但不是兩者。 SQL中還有一些額外的條件;你不需要兩個case語句,並且這個parens可能會讓你失望(實際上他們可能會跳到起來,這段代碼有點難讀)。

試試這個:

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) 

如果你想在同一,然後取出在投影列表(SELECT ...NULL查詢的頂部)的NULL。

相關問題