Sql 案例问题,还是我';我加入了我的行列
在Yellowfin中,我想返回一个值,我有3个表,叫做 成员资格, 会员计划, 成员资格UDP 成员是主成员,与其他两个成员有外部连接(链接可能存在,也可能不存在) 所以如果MemberPlans.PrevFundID有一个条目,我想要它, 否则,如果他们在3个月前加入,我希望成为会员UDPS.Property 否则我想要一个文本短语 目前,我每个memberships有两行。MemberNo,一行显示PRevFundID,另一行显示MembershipsUDPs,我只需要一行: 显示的sql是通过Yellowfin生成的Sql 案例问题,还是我';我加入了我的行列,sql,case,Sql,Case,在Yellowfin中,我想返回一个值,我有3个表,叫做 成员资格, 会员计划, 成员资格UDP 成员是主成员,与其他两个成员有外部连接(链接可能存在,也可能不存在) 所以如果MemberPlans.PrevFundID有一个条目,我想要它, 否则,如果他们在3个月前加入,我希望成为会员UDPS.Property 否则我想要一个文本短语 目前,我每个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)
)
在收到关于完整代码的注释后,我编辑了这篇文章。左侧外部连接链导致了这里的问题。您需要MembershipPlans表或MembershipUDPS表中的任一行,但不能同时使用这两个行。SQL中也有一些无关的条件;你不需要两个case语句,paren可能会绊倒你(事实上,他们可能会绊倒我,这段代码有点难读) 试试这个:
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)
如果您想要相同的列,那么在投影列表中去掉空值(查询顶部的
选择…NULL
。嗨,我最终解决了这个问题。我之所以使用外部联接,是因为表之间的关系不是一对多就是一对多,但我使用子查询重写了查询。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
除非您显示完整的查询,否则很难回答。该case表达式只能返回一个值,因此如果您得到多行,那么其他原因就是原因。请显示整个查询。现在显示完整代码。
成员资格计划
或成员资格UDP
中必须有多个匹配行(或者在这种情况下,您将获得四条记录)。例如,如果成员资格计划
中有多行,您希望使用哪一条记录?我想这是最近的一次?@Chris会员可以有多个会员计划或UDP吗?据我所知,这将是您获取多行的唯一原因。