避免在SQL Server 2005中重复?

时间:2011-07-05 07:12:53

标签: sql-server

我写了这个SQL:

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 个答案:

答案 0 :(得分:0)

看起来您只想按PayID分组(否则将考虑其他列)。

PayDate会有所不同,因此如果您需要其中一个值,则需要在输出中选择所需的确切PayDate。您可能希望考虑Max或Min来选择已存在的那个。

帐户也有所不同,所以你需要再次使用Min或Max

之类的东西

您的查询将如下所示:

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

答案 1 :(得分: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