2014-01-10 52 views
0

内布尔逻辑在SQL Server 2008中,这个查询的工作原理:使用SUM函数

SELECT 
    SUM(CAST(isredeemed AS TINYINT)) AS totalredeemed, 
FROM rewards 
GROUP BY merchantid 

它给你的商家兑换奖励的数量。剧组需要避免出现错误Operand data type bit is invalid for sum operator.

现在我想要做一个类似的查询,但是只能找到在过去几天内获得的奖励。我尝试这样做:

SELECT 
    SUM(CAST((isredeemed & (MIN(dateredeemed) > '2014-01-10 05:00:00')) AS TINYINT)) AS claimedthisweek, 
FROM rewards 
GROUP BY merchantid 

,我得到的错误

附近有语法错误 '>'。

我也试图与&&并与AND更换&。但那些也不起作用。

如何让示例工作?

回答

1

这个问题缺乏详细给出一个确切的答案,但你需要使用一个派生表或子查询的计算。

像这样

SELECT r1.merchantid, r2.claimedthisweek 
FROM rewards r1 
JOIN (
    SELECT merchantid, SUM(CAST(isredeemed AS INT)) claimedthisweek 
    FROM rewards 
    GROUP BY merchantid 
    HAVING MIN(dateredeemed) > '20140101' 
) r2 
+0

是的,这肯定会起作用,可能是最好的解决方案。 – Jonah

0

我想你想这会工作,但它只能算作有些两次:

SELECT 
    SUM(case when MIN(dateredeemed) > '2014-01-10 05:00:00' then 1 else 0 end)  
FROM rewards 
GROUP BY merchantid 
+0

我越来越:'不能对包含聚合或subquery' – Jonah

+0

高雅的表达式执行聚合函数,我在那里评论...什么是isredeemed? – Nix

+0

只是一个真/假位字段 – Jonah

0

这应该是having子句上,像这样:

SELECT 
    SUM(CAST((isredeemed AS TINYINT)) AS claimedthisweek 
    FROM rewards 
    GROUP BY merchantid 
    HAVING MIN(dateredeemed) > '2014-01-10 05:00:00' 
+0

不幸的是,我选择了其他记录,我不想受限于HAVING子句。 – Jonah

0

任何理由不这样做滤波在“where”子句级别?这应该工作,只要你符合聚合在同一条件的所有行:

SELECT 
    SUM(CAST(isredeemed AS TINYINT)) AS claimedthisweek 
FROM rewards 
WHERE dateredeemed > '2014-01-10 05:00:00' 
GROUP BY merchantid 
+0

我有其他记录我选择,我不想限制在WHERE或HAVING子句 – Jonah

+0

啊,根据其他评论我想这也会过滤出你不想通过HAVING过滤出的行。 – jiv

+0

我相信尼克斯的答案会在dateredeemed周围没有MIN()的情况下工作。我可能误解了上下文,但是我认为它没有意义为每一行汇总dateredeemed - 每一行都有自己的dateredeemed。case表达式将为每个不在所需的日期范围内的行返回一个零,所以你只能得到那些已有的日期。 – jiv