CASE问题,或者我是如何加入我的桌子的

时间:2015-09-03 23:50:42

标签: sql case

在Yellowfin想要返回一个值,我有3个表调用 会员资格, membershipPlans, membershipUDPs。

成员是与其他两个人有外连接的主要成员(链接可能存在或可能不存在)

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

目前我每个成员资格获得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)
         )

我在收到有关完整代码的评论后对此进行了编辑

2 个答案:

答案 0 :(得分:1)

LEFT OUTER JOIN链在这里引起了问题。您希望从MembershipPlans表 MembershipUDPS表中 行,但不能同时使用两者。 SQL中也存在一些无关的条件;你不需要两个案例陈述,并且parens可能会绊倒你(事实上他们可能会绊倒 me up,这段代码很难阅读)。

试试这个:

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(查询顶部的SELECT ...NULL)。

答案 1 :(得分:1)

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

var posts =  $http.get(...).then(function(response){
  return response.data.items;
});

return {
  getList: function(){
    return posts;
  }
}

// Call getList() the same way as above