Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 案例问题,还是我';我加入了我的行列_Sql_Case - Fatal编程技术网

Sql 案例问题,还是我';我加入了我的行列

Sql 案例问题,还是我';我加入了我的行列,sql,case,Sql,Case,在Yellowfin中,我想返回一个值,我有3个表,叫做 成员资格, 会员计划, 成员资格UDP 成员是主成员,与其他两个成员有外部连接(链接可能存在,也可能不存在) 所以如果MemberPlans.PrevFundID有一个条目,我想要它, 否则,如果他们在3个月前加入,我希望成为会员UDPS.Property 否则我想要一个文本短语 目前,我每个memberships有两行。MemberNo,一行显示PRevFundID,另一行显示MembershipsUDPs,我只需要一行: 显示的sql

在Yellowfin中,我想返回一个值,我有3个表,叫做 成员资格, 会员计划, 成员资格UDP

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

所以如果MemberPlans.PrevFundID有一个条目,我想要它, 否则,如果他们在3个月前加入,我希望成为会员UDPS.Property 否则我想要一个文本短语

目前,我每个memberships有两行。MemberNo,一行显示PRevFundID,另一行显示MembershipsUDPs,我只需要一行: 显示的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)
         )

在收到关于完整代码的注释后,我编辑了这篇文章。

左侧外部连接链导致了这里的问题。您需要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吗?据我所知,这将是您获取多行的唯一原因。