2015-03-25 139 views
0

分组我有以下查询写在MSSQL:GROUP BY子句不

Select customer.name, 
max(callnote.ID), 
CAST (callnote.NOTE as VARCHAR(100)) 
from callnote 
join CONTACT   
    on 
     contact.ID=callnote.CONTACT_ID 
join CUSTOMER  
    on 
     customer.ID=contact.CUSTOMER_ID 
where callnote.TYPE='n' and CUSTOMER.AcctClass>='1' 
group by customer.NAME, CAST (callnote.NOTE as VARCHAR(100)) 
order by customer.NAME 

我希望只接收每个客户的名字一个记录(最后一个音符)。 (789行,当我离开CAST(callnote.NOTE as VARCHAR(100))')时,我得到的结果是我得到的结果,而我认为是每个联系人(最多11,500行)的最后一个注释。我已经花了好几个小时的脑筋,重写了这么多次。客户表和callnote表之间没有共同的列。我如何得到这个只显示每个客户的最后一个笔记?

+0

你应该读入每组最大ñ....你被错误地查看数据。如果你需要帮助,你需要澄清问题并添加数据 – 2015-03-25 04:17:32

+0

像这样的字符串比较是非常糟糕的事情:AcctClass> ='1'因为'10'>'2'不是真的,因为它是一个字母顺序比较。 – 2015-03-25 04:29:00

+0

感谢JamesZ的领导......你完全正确。我需要打破引用所有内容的坏习惯 – nerdyone1977 2015-03-26 19:33:13

回答

0

我假设你想要从最大callnote ID的音符注释?所以像这样:

Select 
    C.name, 
    n.ID, 
    n.NOTE 
from 
    CUSTOMER c 
    outer apply (
    select top 1 
     callnote.ID, 
     CAST (callnote.NOTE as VARCHAR(100)) 
    from 
     CONTACT 
     join callnote 
     on contact.ID=callnote.CONTACT_ID and callnote.TYPE='n' 
    where 
     c.ID=contact.CUSTOMER_ID 
    order by 
     callnote.ID desc) n 
where 
    c.AcctClass>='1' 
order by 
    c.NAME 

因此,这总是从该客户的最大id提取行。希望语法是好的,不能真的测试这个。

+0

谢谢Jamesz。该解决方案运行良好。我从来不知道'外套'存在。 – nerdyone1977 2015-03-25 22:11:24

0

你可以试试这个

SELECT Name, MAX(CallNoteID) CallNoteID, CallNote 
FROM 
(
SELECT Customer.Name, 
     CallNote.ID CallNoteID, 
     TRIM(CAST(CallNote.Note as VARCHAR(100))) CallNote 
FROM CallNote 
JOIN Contact ON Contact.ID = CallNote.CONTACT_ID 
JOIN Customer ON Customer.ID = Contact.CUSTOMER_ID 
WHERE CallNote.Type = 'n' AND Customer.AcctClass >= '1' 
) A 
GROUP BY Name, CallNote 
ORDER BY Name