2014-03-27 191 views
2

我正在使用SQL Server 2005,並且我的SQL查詢出現問題。基本上,我想根據所有客戶交易的最新日期,獲取由公司分組的所有客戶交易總額。SQL Server 2005 MAX,SUM和GROUP BY

的樣本數據:

Customer_Id Date   Amount COMPANY 
------------------------------------------------- 
1    3/3/2014   9021 COMPANY X 
2    3/3/2014   12000 COMPANY Y 
2    3/15/2014   10000 COMPANY Y 
2    3/30/2014   8000 COMPANY Y 
4    3/13/2014   10000 COMPANY Z 
5    3/14/2014   1400 COMPANY X 
1    3/16/2014   2500 COMPANY X 
7    3/14/2014   110  COMPANY Y 
3    3/17/2014   1500 COMPANY Z 
2    3/19/2014   2044 COMPANY Y 
3    3/09/2014   9400 COMPANY Z 
3    3/11/2014   8950 COMPANY Z 
2    3/31/2014   3455 COMPANY Y 
3    3/15/2014   950  COMPANY Z 
6    3/15/2014   5543 COMPANY X 

我想做到的是這樣的:

COMPANY  TOTAL 
COMPANY X  9443 --> sum from customer_id 1 (2500, as of 3/16/2014) and customer_id 6 (5542, 3/15/2014) and customer_id 5 (1400 as of 3/14/2014) 
COMPANY Y  3455 --> sum from customer_id 2 (3455, as of 3/31/2014) 
COMPANY Z  10950 --> sum from customer_id 4 (1000, as of 3/13/2014) and customer_id 3 (950, as of 3/15/2014) 

下面是一些SQL查詢我試着不上我的目標而努力:

SELECT TOP (1) WITH TIES 
    Date, Company, SUM(Amount) AS total 
FROM   
    tbl_Table 
GROUP BY 
    Date, Company 
ORDER BY 
    Date DESC 

SELECT  
    t1.Date, t1.Company, SUM(t1.Amount) AS total 
FROM   
    tbl_Table AS t1 
INNER JOIN 
    (SELECT 
     MAX(Date) AS date, Company 
    FROM 
     tbl_Table 
    GROUP BY 
     Company) AS t2 ON t1.Date = t2.Date AND t1.Company = t2.Company 
GROUP BY 
    t1.Date, t1.Company 


WITH latest AS 
(SELECT 
    Company, MAX(Date) AS maxdate 
FROM   
    tbl_Table 
GROUP BY 
    Company 
) 
SELECT  
    a.Date, a.Company, SUM(a.Amount) AS total 
FROM  
    tbl_Table AS a 
INNER JOIN 
    latest AS b ON a.Company = b.Company AND a.Date = b.maxdate 
GROUP BY 
    a.Date, a.Company 

回答

1

您提供的數據仍然不正確。

SQLFIDDLEExample

查詢:

SELECT t1.Company, 
     SUM(t1.Amount) Total 
FROM Table1 t1 
    LEFT JOIN Table1 t2 
    ON t1.COMPANY = t2.COMPANY 
     AND t1.Customer_Id = t2.Customer_Id 
     AND t1.Date < t2.Date 
    WHERE t2.Customer_Id is null 
GROUP BY t1.Company 

結果:

| COMPANY | TOTAL | 
|-----------|-------| 
| COMPANY X | 9443 | 
| COMPANY Y | 3565 | 
| COMPANY Z | 11500 | 
+0

謝謝,@Justin。你的解決方案解決了這一切雖然我現在不明白你的SQL代碼(即時新的SQL查詢),我會很快。再次感謝。關於「你的結果仍然不正確,你給的數據」,我忽略了這一點。抱歉。 – RedJohn

0

試試這個

WITH cte AS (
     SELECT Amount,Company, 
       ROW_NUMBER() OVER (PARTITION BY Customer_Id ORDER BY CAST([Date] AS DATETIME) desc) 
       AS dateRowRank 
    ) 

    SELECT Company,SUM(Amount) 
    FROM cte 
    WHERE dateRowRank=1 
    GROUP BY Company 
+0

先生米哈桑。我不知道你的sql代碼有什麼問題,但是當我執行查詢時,我的sql server 2005壓縮了。我注意到這個問題也發生在我試過的其他sql查詢中包含「row_number()」和「over partition」。 – RedJohn