2014-10-29 73 views
1

我需要编写一个sql脚本,用于在每个月初开始赎回后计算我们的客户剩余点数。但我不太确定SQL查询和SQL脚本。 我写了两个查询来计算赚取和花费的积分。为了获得总积分:如何在sql脚本中执行减法功能

select Tbl_member.member_id,sum(points_earned) 
    from Tbl_member, Tbl_member_participation 
    where tbl_member_participation.member_id = Tbl_member.member_id 
    group by Tbl_member.member_id, 

和点花:

select Tbl_member.member_id,sum(points_redeemed) 
    from Tbl_member, Tbl_member_redemption 
    where tbl_member_redemption.member_id = Tbl_member.member_id 
    group by Tbl_member.member_id 

我想从获得的积分减去废点,但我不知道如何将其合并成一个劲儿地输出sql脚本。以及如何使这个运行每个月。

+0

纯SQL或数据库?没有前端? – Edrich 2014-10-29 05:06:51

+0

pure sql,没有前端〜 – xiaopassion 2014-10-29 05:09:59

+0

我相信@Edirich希望你指定你是否运行MySQL,Oracle,SQL Server等。 – 2014-10-29 05:18:51

回答

1

试试这个

SELECT Tbl_member.member_id, 
     Sum(points_earned) - Sum(points_redeemed) Remaining_points 
FROM Tbl_member 
     JOIN Tbl_member_participation 
     ON tbl_member_participation.member_id = Tbl_member.member_id 
     JOIN Tbl_member_redemption 
     ON tbl_member_redemption.member_id = Tbl_member.member_id 
GROUP BY Tbl_member.member_id, 
      Datepart(mm, datecol), 
      Datepart(yyyy, datecol) 
+0

“Tbl_member_redemption”表在哪里? – 2014-10-29 05:28:19

+0

你错过了它,现在增加 – 2014-10-29 05:31:00

+0

如果客户没有兑换任何积分并只赢得积分怎么办? – 2014-10-29 05:31:21

1

您可以简单地使用UNION函数来组合两个查询结果。 此查询未经过测试,但这些是您可以使用UNION简单播放两个查询的方式。

SELECT 
    member_id, 
    SUM(points_earned) - SUM(points_redeemed) 
FROM 
(
    SELECT 
     Tbl_member.member_id, 
     sum(points_earned) points_earned, 
     0 AS points_redeemed 
    FROM 
     Tbl_member, 
     Tbl_member_participation 
    WHERE 
    tbl_member_participation.member_id = Tbl_member.member_id 
    GROUP BY 
    Tbl_member.member_id 


    UNION ALL 

    select 
     Tbl_member.member_id, 
     0 AS points_earned, 
     sum(points_redeemed) points_redeemed 
    from 
     Tbl_member, Tbl_member_redemption 
    where 
     tbl_member_redemption.member_id = Tbl_member.member_id 
    group by 
     Tbl_member.member_id 

) as 
a 
GROUP BY 
member_id 
+0

@xiaopassion请回复我,如果这些查询给出了什么错误 – 2014-10-29 05:12:02

+0

谢谢〜但是如何确保这个脚本可以运行每个月的记录?为什么需要“0 AS points_redeemed”? – xiaopassion 2014-10-29 05:13:51

+0

因为你需要相同数量的列在这两个查询然后只有联合会工作,这就是为什么我把0作为points_redeemed.for进一步参考http://stackoverflow.com/questions/49925/what-is-the-difference-between -union-and-union-all – 2014-10-29 05:20:50

1

你正在做CROSS JOIN,这不是你想要的(from Tbl_member, Tbl_member_participation)。改为使用LEFT JOIN或INNER JOIN。

SQL脚本可以包含多个查询和其他命令,如FOR等,也可以包含GO语句。从你的角度来看,这并不重要。

SELECT m.member_id, SUM(mr.points_redeemed), SUM (mp.points_earned), 
     ISNULL(SUM(mp.points_earned),0) - ISNULL(SUM(mr.points_redeemed),0) as Result 
    FROM Tbl_member m 
    LEFT JOIN Tbl_member_redemption mr ON mr.member_id = m.member_id 
    LEFT JOIN Tbl_member_participation mp ON mp.member_id = m.member_id 
    GROUP BY m.member_id 

您可以通过一个查询来实现您的目标。 如果你想为个别月份的结果,只需添加一个标准的GROUP BY这样的:

GROUP BY m.member_id, MONTH(nameOfDateColumn), YEAR(nameOfDateColumn) 
+0

谢谢!我会试试这个。 – xiaopassion 2014-10-29 05:35:36

1

,如果你不关心该查询应显示行的所有成员,那么你可以删除喜欢

SELECT p.member_id, 
     Sum(points_earned), 
     Sum(points_redeemed), 
     Sum(CASE 
      WHEN points_earned IS NULL THEN 0 
      ELSE points_earned 
      END) - Sum(CASE 
         WHEN points_redeemed IS NULL THEN 0 
         ELSE points_redeemed 
         END) AS diff 
FROM Tbl_member_participation p 
     LEFT OUTER JOIN tbl_member_redemption r 
        ON p.member_id = r.member_id 
GROUP BY p.member_id 

加入的成员表,否则使用:

SELECT m.member_id, 
     Sum(points_earned), 
     Sum(points_redeemed), 
     Sum(CASE 
      WHEN points_earned IS NULL THEN 0 
      ELSE points_earned 
      END) - Sum(CASE 
         WHEN points_redeemed IS NULL THEN 0 
         ELSE points_redeemed 
         END) AS diff 
FROM Tbl_member m 
     LEFT OUTER JOIN Tbl_member_participation p 
        ON m.member_id = p.member_id 
     LEFT OUTER JOIN tbl_member_redemption r 
        ON m.member_id = r.member_id 
GROUP BY m.member_id ; 

,如果你想找到的差异月明智然后

SELECT m.member_id,datepart(mm,p.earndate),datepart(yyyy,p.earndate), 
     Sum(points_earned), 
     Sum(points_redeemed), 
     Sum(CASE 
      WHEN points_earned IS NULL THEN 0 
      ELSE points_earned 
      END) - Sum(CASE 
         WHEN points_redeemed IS NULL THEN 0 
         ELSE points_redeemed 
         END) AS diff 
FROM Tbl_member m 
     LEFT OUTER JOIN Tbl_member_participation p 
        ON m.member_id = p.member_id 
     LEFT OUTER JOIN tbl_member_redemption r 
        ON m.member_id = r.member_id and p.earndate = r.redeemdate 
GROUP BY m.member_id,datepart(mm,p.earndate),datepart(yyyy,p.earndate) 

here是SQL小提琴演示

+0

SQL Server中有一个ISNULL函数。另外当你SUM值和其中一些是NULL你不需要使用ISNULL。 – 2014-10-29 06:01:06

+0

谢谢您注意,'isnull'可以用来代替'case when','coalesce'也是另一种选择。但是,假设有points_earned并且没有point_redeem(在那个月),那么差异将会是NULL,这就是我添加它的原因,并且在使用实际DB时可能不会出现这种情况。这可以详细说明:http://sqlfiddle.com/#!3/891e3/3。查看两个查询的区别 – 2014-10-29 06:44:39

+0

其实你把一些工作详细说明了这个答案,所以+1。但是'ON m.member_id = r.member_id和p.earndate = r.redeemdate'这部分不会像它应该那样工作。 – 2014-10-29 06:59:19