SQL Server 2000中两组数据之间的差异

时间:2009-09-03 11:30:17

标签: sql sql-server join sql-server-2000

我正在尝试解决过去3个月内收费的客户与整个客户群之间的差异。我已经能够计算使用以下SQL

计费的客户
DECLARE @DateFrom AS DATETIME
SET @DateFrom = 
   CONVERT(DATETIME, CAST(YEAR(GETDATE()) AS VARCHAR(4)) + 
   '-' + 
   CAST(MONTH(DATEADD(MONTH, -3, GETDATE())) AS VARCHAR(2)) + '-01', 120)

DECLARE @DateTo AS DATETIME
SET @DateTo = 
   CONVERT(DATETIME, CAST(YEAR(GETDATE()) AS VARCHAR(4)) + 
   '-' + 
   CAST(MONTH(GETDATE()) AS VARCHAR(2)) + '-01', 120)

SELECT DISTINCT
    i.CustomerCode
FROM
    Invoice AS i
WHERE
    (i.InvoiceDate > @DateFrom AND i.InvoiceDate < @DateTo)

我将要比较的表将是Customer表,它也有一个CustomerCode字段。

提前致谢!

修改

花了很多年的时间试图解决这个问题,并在发布此消息几分钟之后,我找到了解决方案。使用NOT IN子句!

SELECT
    c.CustomerCode
FROM
    [Customer] AS c
WHERE
    c.CustomerCode NOT IN (
SELECT DISTINCT
    i.CustomerCode
FROM
    [Invoice] AS i
WHERE
    (i.InvoiceDate >= @DateFrom AND i.InvoiceDate < @DateTo)) 

在我的Senario中,当我在Management Studio中测试每个步骤时,这似乎比下面提到的步骤更快。

2 个答案:

答案 0 :(得分:3)

您可以通过以下方式改善日期处理:

WHERE i.InvoiceDate >= DATEADD(mm,-3,DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0))
    AND i.InvoiceDate < DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0)

注意我在开始时使用了&gt; =,您在开始日期缺少时间为00:00:00的行。

要获得在过去3个月内没有发票的所有客户,您也可以这样写:

SELECT
    c.CustomerCode
FROM Customer                c
    LEFT OUTER JOIN Invoice  i ON c.CustomerCode=i.CustomerCode
        AND i.InvoiceDate >= DATEADD(mm,-3,DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0))
        AND i.InvoiceDate < DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0)
WHERE i.CustomerCode IS NULL

答案 1 :(得分:2)

为了获得在一段时间内没有收费的客户:

SELECT      c.CustomerCode
FROM        [Customer] AS c
LEFT JOIN   [Invoice] AS i
        ON  c.CustomerCode = i.CustomerCode 
        AND i.InvoiceDate > @DateFrom AND i.InvoiceDate < @DateTo
WHERE       i.CustomerCode IS NULL

虽然我会用KM的建议替换@DateFrom and @DateTo日期范围检查,以避免使用变量。