2011-07-05 27 views
0

私はこのSQLを書いています:SQL Server 2005で重複を避けるには?

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つの記録(重複を避けるため)、このような量の合計を表示するために、次のとおりです:

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 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列が異なる含まれていることである。

アカウントもあなたのクエリは、このようになりminまたはmax

のようなものので、もう一度あなたが使用して1を選択する必要があり、変わります値。グループ化されたものについては、それらがすべて同じ日付を表すように、内部の値を正規化する必要があります。これは、望ましくないかもしれない各行を更新することによって達成することができます。

日付のみを含む別の行を追加することもできます(この場合、時刻の値は常に00:00:00でなければなりません)。

第3の選択肢は、標準化された日付の値を含むサブクエリを作成することです。これは最初にお勧めします。下の私の例を見て、これを達成する方法を理解することができます。テーブル変数を、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 
関連する問題