【问题标题】:Difference between two sets of data in SQL Server 2000SQL Server 2000 中两组数据的区别
【发布时间】:2009-09-03 11:30:17
【问题描述】:

我正在尝试计算过去 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)) 

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

【问题讨论】:

  • 你到底想要什么?过去 3 个月内未计费的所有客户的列表?您使用的是哪个版本的 SQL Server?
  • 正是如此。我正在使用 SQL Server 2000。有没有比我目前拥有的更好的解决方案?
  • 不,我认为在 SQL Server 2000 中,这很简单。

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


【解决方案1】:

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

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

请注意,我在开始时使用了 >=,您在开始日期的时间为 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

【讨论】:

  • 日期处理技巧很好。但是应该更改查询,以便 InvoiceDate 范围检查是 LEFT OUTER JOIN 的 ON 子句的一部分,而不是 WHERE。
  • @van,duh,是的,它不能在 WHERE 中使用,它必须在 ON
【解决方案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 日期范围检查以避免使用变量。

【讨论】:

    猜你喜欢
    • 2011-02-13
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多