[英]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.