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
在 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