Sql Query只返回本月添加的项目

时间:2014-04-06 23:31:23

标签: sql sql-server

我正在寻找只返回该月新项目的查询。即如果此项目在上个月被排除。

我的表看起来像这样

Date         fruit    buyer
2014-04-01   Apple    someone1
2014-04-01   Banana    someone2
2014-05-01   Apple    someone2
2014-05-01   Banana    someone2
2014-05-01   Pear    someone1

所以在上面的例子中,我想要一个查询,如果为2014-05-01运行,只返回苹果和梨,因为买家或水果是不同的。但不是香蕉,因为那个确切的记录是在上个月。

我试图在自身上使用一个不存在的查询,即

select Date, Fruit, buyer
from table
where date = 2014-05-01 and not exists(
select Date, Fruit, buyer
from table
where date = 2014-04-01)

但这似乎长期存在并且没有返回正确的结果。

我也知道一个解决方案是将买家标准化,但目前不是一个选择。 (是长期的)

这是在MSSQL上。

提前致谢

4 个答案:

答案 0 :(得分:0)

你需要尝试这样的事情,我的道歉,对于前一个,但想法是一样的,你可以访问此链接了解更多

http://technet.microsoft.com/en-us/library/bb264565(v=sql.90).aspx

SELECT     EmployeeID, FirstName, LastName, HireDate, City
FROM       Employees
WHERE      (HireDate >= '1-june-1992') AND (HireDate <= '15-december-1993')

答案 1 :(得分:0)

我通过

解决了这个问题
select Date, Fruit, buyer
from table e
where date = 2014-05-01 
  and not exists(
    select Date, Fruit, buyer
    from table d
    where date = 2014-04-01 
      and e.buyer = d.buyer 
      and e.fuit = d.fruit)

答案 2 :(得分:0)

你需要从上个月中排除买家

SELECT DATE,FRUIT, BUYER FROM TABLE
WHERE FRUIT IN (
(
  Select Fruit
  from
  (
   SELECT FRUIT,BUYER FROM TABLE WHERE DATE = '2014-05-01'
   EXCEPT
   SELECT FRUIT,BUYER FROM TABLE WHERE DATE = '2014-04-01'
  ) T1
)

               )
AND DATE = '2014-05-01'

答案 3 :(得分:0)

我使用内部联接来创建查询 尝试以下查询

数据:

xDate       fruit   buyer
----------------------------
2014-04-01  Apple   someone1
2014-04-01  Banana  someone2
2014-05-01  Apple   someone2
2014-05-01  Banana  someone2

查询:

select 
    convert(nvarchar(10),a.xdate,110),a.fruit, a.buyer
from 
    @temp a 
    inner join
    (
        select 
            b.fruit, b.buyer,b.fruit + ' ' + b.buyer as 'xField', count(*) as total
        from @temp b
        group by b.fruit, b.buyer, b.fruit + ' ' + b.buyer
        having 
        count(*) = 1
    ) c on a.fruit = c.fruit and a.buyer = c.buyer
where 
    a.xDate < dateadd(day,1,'20140630')
    --convert(nvarchar(6),a.xdate,112) = '201405'

结果:

            fruit   buyer
----------------------------
05-01-2014  Apple   someone2
05-01-2014  Pear    someone1

注意: 如果你需要where子句中的Year 添加

DATEPART(Year, xdate) = 2014
DATEPART(Month,xdate) = 5

<强>更新:
如果你不想使用datepart func,你可以使用where where子句:
(格式字符串'YYYYMM')

convert(nvarchar(6),a.xdate,112) = '201405' 

如果我们在数据中添加了这2条记录:

2014-03-05 Apple    someone2
2014-03-10 Apple    someone1

结果数据中只显示梨

05-01-2014  Pear    someone1

第二次更新

要防止NON-SARGable查询,where子句将更改为:

a.xDate < dateadd(day,1,'20140630')