我正在寻找只返回该月新项目的查询。即如果此项目在上个月被排除。
我的表看起来像这样
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上。
提前致谢
答案 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')