2011-07-05 103 views
0

我寫這個SQL:避免在SQL Server 2005中重複?

select distinct PayID, PaymentDate, AccountNumber, sum(PaymentAmount) as Amount 
from tblInvoicePaymentDetails 
where CustomerID = 'mud4978' 
group by PayID, PaymentDate, AccountNumber 

輸出是:

PayID PayDate     Account  Amount 
1  2011-07-05 11:09:14.390 NULL  700.00 
1  2011-07-05 11:09:14.407 NULL  100.00 
2  2011-07-05 11:20:05.517 NULL  0.00 
2  2011-07-05 11:20:05.547 9000  500.00 
2  2011-07-05 11:20:07.000 9000  100.00 
3  2011-07-05 12:19:22.017 100000  200.00 
3  2011-07-05 12:19:22.077 100000  100.00 

但我的要求是,以顯示3條記錄(避免重複)和量的總和是這樣的:

payid   paydate    account  amount 
1   2011-07-05 11:09:14 null   800.00 
2   2011-07-05 11:20:05 9000   600.00 
3   2011-07-05 12:19:22 100000  300.00 

請幫忙

+2

順便說一句,您已經提出了11個問題,並接受了零個答案。如果你回去接受幫助你的答案,那將是很有禮貌的。 –

回答

0

它看起來像你只想分組付款ID(否則其他列將被考慮在內)。

PayDate各不相同,所以如果您需要其中一個值,您需要在輸出中選擇您想要的確切PayDate。你不妨考慮Max或Min來選擇一個已經存在的。

帳戶也各不相同,如此反覆,你需要使用類似的最低或最高

您的查詢會再看看這樣的事情挑一:

SELECT DISTINCT 
    PayID, 
    MIN(PaymentDate) AS PaymentDate, 
    MAX(AccountNumber) as AccountNumber, 
    SUM(PaymentAmount) as Amount 
FROM tblInvoicePaymentDetails 
WHERE CustomerID='mud4978' 
GROUP BY PayID 
0

的問題是,paydate列包含不同值。您需要對內部的值進行規範化,以便它們代表應該分組的所有相同日期。這可以通過更新每行,您可能不想要。

您可以添加另一個僅包含日期的行(在這種情況下,時間值必須始終爲00:00:00)。

第三種方法是創建一個包含規格化日期值的子查詢,我將爲之開始推薦。您可以通過查看下面的示例來了解如何實現此目的。用select語句中的表名替換表變量以及列名。

DECLARE @x TABLE (
amount int, 
dt DateTime) 

INSERT INTO @x (amount, dt) VALUES (1, '01.01.2005 12:00:12') 
INSERT INTO @x (amount, dt) VALUES (2, '01.01.2005 10:00:12') 
INSERT INTO @x (amount, dt) VALUES (2, '01.02.2005 10:00:12') 

SELECT SUM(a), b FROM 
    (
     SELECT 
      amount AS a, 
      DATEADD(dd, 0, DATEDIFF(dd, 0, dt)) AS b 
     FROM 
      #x 
    ) subtable 
GROUP BY b