日期:2014-05-18  浏览次数:20548 次

求关于分组过滤的sql语句?????????多谢指教!!!!!
表结构:
客户表account,联系人表contact
字段:
account.account(客户名称),contact.createdate(联系人创建时间)
关联:
account.accountid=contact.accountid
关系:
account:contact=1对多(一个客户对应多个联系人)

需求:
用一个sql语句查出所有30天未新建联系人的客户名称及最后一次创建联系人时间。

分析:
首先要获得每个客户的最后一次新建联系人的创建时间(contact.createdate),再在这个查询结果中获得创建时间在30天以前的客户id(contact.accountid),最后关联客户表查出客户名称(account.account)和该客户最后一次创建联系人时间(contact.createdate)




------解决方案--------------------
--每个客户的最后一次新建联系人的创建时间
select accountid, max(createdate) from contact group by accountid

--所有30天未新建联系人的客户名称
select * from contact a where not exists (select 1 from contact where accountid = a.accountid and abs(datediff(day, createdate, a.createdate)) <= 30)

------解决方案--------------------
--试试这个
select a.account,max(a.createdate) as createdate
from contact a
where not exists(select 1 from contact where accountid = a.accountid and datediff(dd, createdate, '要查询的日期 ') <= 30)
group by a.account
------解决方案--------------------
不用MAX,一句话写不出来吧。。偶这个是效率最高的
SELECT a.accountid,a.name,b.name,max(b.createdate) FROM account a inner join contact b on a.accountid=b.accountid where datediff(day,b.createdate,getdate())> 30 group by a.name
------解决方案--------------------
lmdotnet(lmnet) ( ) 信誉:100 2007-08-24 15:46:21 得分: 0


这个sql需要在客户端软件中拼出来,客户端软件只能定义where中的语句,select中只能直接选择字段名称,无法加max。

所以,还是那个要求,在select中不用MAX,where中可以用,如何实现啊!!

----------------

這麼寫吧

Select
account.account, contact.createdate
From
account,
contact
Where account.accountid = contact.accountid
And account.accountid Not In (Select Distinct accountid From contact Where DateDiff(dd, createdate, GetDate()) <= 30)
And createdate = (Select Max(createdate) From contact Where accountid = account.accountid)

在select部分填入account.account, contact.createdate
在表名部分填入account, contact
在where部分填入
account.accountid = contact.accountid
And account.accountid Not In (Select Distinct accountid From contact Where DateDiff(dd, createdate, GetDate()) <= 30)
And createdate = (Select Max(createdate) From contact Where accountid = account.accountid)

語句的效率不高,但是能實現你的要求。

估計表的別名也是不能用的。

你的限制太多了,只好這麼寫。