2013-08-07 41 views
0

我想查詢具有這些PARAMS數據庫:如何嵌套這些SQL語句而沒有group by子句錯誤?

交易日期,用戶電子郵件地址

我所做的就是用這個查詢:

SELECT [User Email Address], COUNT(*) AS 'count' 
    FROM 
     [DATABASE].[TABLE] 
    GROUP BY [User Email Address] 

,顯示使用參數表:

郵箱地址,算上

在這種情況下,數列顯示的賦存數量在原始表中的用戶電子郵件的es。

接下來我要做的是查看截至今天的最後一年的交易日期列,並將該子集的計數列與原始計數列(可追溯大約3年)進行比較。具體來說,我希望我的最終結果表是:

用戶用戶電子郵件地址,countDiff

其中countDiff是從1年子集和原來的子集數的差異。

我曾嘗試:

SELECT [User Email Address], [Transaction Date], [count - COUNT(*)] AS 'countdDifference' 

FROM (

    SELECT [User Email Address], COUNT(*) AS 'count' 
    FROM 
     [DATABASE].[TABLE] 
    GROUP BY [User Email Address] 


) a 

WHERE a.[Transaction Date] >= '2011-08-07 00:00:00.000' 


ORDER BY [count] DESC 

但我得到的錯誤[Transaction Date]不是在GROUP BY子句或集合。如果我把它放在[User Email Address]旁邊,它會混淆數據。

這實際上是我遇到的一個常見問題。任何方法來規避這一點?

+0

'與原始計數列':什麼原始的?是否有包含[用戶電子郵件地址]和[計數]字段的表格? –

+0

對不起,我的意思是我從第一個查詢中做出的「count」列:SELECT [用戶電子郵件地址],COUNT(*)AS'count' – user2522217

回答

3

您需要使用兩個不同的子查詢:一個計數滿條目和另一個計數去年的條目。

也許這將幫助你:

SELECT a.*, a.[count] - Coalesce(b.[count], 0) as 'countDif' 
FROM 
    (
     SELECT [User Email Address], COUNT(*) AS 'count' 
     FROM [DATABASE].[TABLE] 
     GROUP BY [User Email Address] 
    ) AS a 
    LEFT JOIN (
     SELECT [User Email Address], COUNT(*) AS 'count' 
     FROM [DATABASE].[TABLE] 
     WHERE [Transaction Date] >= '2011-08-07 00:00:00.000' 
     GROUP BY [User Email Address] 
    ) AS b ON a.[User Email Address] = b.[User Email Address] 
+0

非常感謝,完美的作品! – user2522217

2

您可以在一個SELECT做到這兩點:

SELECT [User Email Address], 
    SUM(CASE WHEN [Transaction Date] >= '2011-08-07' THEN 1 ELSE 0 END) AS 'FilteredCount', 
    COUNT(*) AS 'TotalCount', 
    COUNT(*) 
     - SUM(CASE WHEN [Transaction Date] >= '2011-08-07' THEN 1 ELSE 0 END) 
     AS 'CountDifference' 
    FROM 
     [DATABASE].[TABLE] 
    GROUP BY [User Email Address] 
+0

'a。[Transaction Date]'從哪裏來?它不是從子選擇返回.... –

+0

@MichaelFredrickson謝謝,沒有捕捉到 - 我已經刪除了使用這兩個選項,因爲他們不會工作。 –

+0

哦,我甚至沒有想到在同一時間做兩個。 – user2522217

2

您可以使用此:

SELECT [User Email Address], 
     [Transaction Date], 
     count1.count - isnull(count2.count,0) as [countdDifference] 
FROM (SELECT [User Email Address], COUNT(*) AS 'count' 
     FROM [DATABASE].[TABLE] t1 
     GROUP BY t1.[User Email Address]) as count1 
LEFT JOIN (SELECT [User Email Address], COUNT(*) AS 'count' 
     FROM [DATABASE].[TABLE] t2 
     GROUP BY [User Email Address] 
     WHERE t2.[Transaction Date] >= '2011-08-07 00:00:00.000') as count2 
ON  count2.[User Email Address] = count1.[User Email Address] 
ORDER BY 3 DESC 

,因爲它是用一堆你也應該開始考慮1)不使用count(這幾乎是一個reserved word但不完全); 2.)不要在字段名稱中使用空格; 3.)找到一個易於閱讀的方式來組織你的SQL :)

+0

感謝您的提示和解決方案! – user2522217

1

,這樣的事情呢?

SELECT 
    [User Email Address], 
    count(*) AS Total, 
    sum(CASE 
      WHEN [Transaction Date] >= '2011/08/07 00:00:00.000' THEN 1 
      ELSE 0 
     END) AS WithinDateRange, 
    count(*) 
     - sum(CASE 
        WHEN [Transaction Date] >= '2011/08/07 00:00:00.000' THEN 1 
        ELSE 0 
       END) AS Difference. 
FROM [DATABASE].[TABLE] 
GROUP BY [User Email Address] 
+0

嗯,它給了我一個「錯誤的語法附近'計數'」 – user2522217

+0

我錯過了一個逗號。我已經更新了我的答案。 – cadrell0