繁体   English   中英

SQL查询仅返回本月添加的项目

[英]Sql Query to return only items added this month

我正在寻找一个仅返回当月新商品的查询。 即,如果该项目在上个月,则排除。

我的桌子看起来像这样

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上。

提前致谢

对于上一个,您需要尝试类似的操作,我很抱歉,但是想法是相同的,您可以访问此链接以获取更多信息。

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

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

我解决了

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)

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

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'

我使用内部联接来创建查询,尝试下面的查询

数据:

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函数,则可以在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')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM