2014-01-10 76 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