2012-07-06 4 views
0

두 개의 쿼리를 병합하려고합니다. 목표는 MAX (ID)를 기반으로하는 최신 리스팅의 제목과 제목과 함께 고유 한 고객 전자 메일이있는 레코드 세트를 얻는 것입니다.MS SQL DISTINCT가있는 MAX (ID)를 기반으로 여러 열을 선택하십시오.

DISTINCT를 사용하면 전자 메일과 ID를 얻을 수 있지만 분명히 제목을 추가하면이 문제가 해결됩니다.

내가 지금까지 무엇을 가지고 :

SELECT DISTINCT MAX(EV_ID) As EV_ID, EV_ContactEmail, EV_CusName 
FROM tblEvents ev 
INNER JOIN tblCustomers cus ON cus.CUS_ID = ev.EV_CustomerID 
WHERE (
    CUS_IsAdmin = 'y' 
    AND CUS_Live = 'y' 
    AND EV_Live = 'y' 
    AND EV_EndDate >= '2012/7/5 12:00:00 AM' 
    AND EV_ContactEmail <> '' 
    ) 
GROUP BY EV_ContactEmail 

은 내가 가입 자체를 할 필요가 나타 말을 여기에 일부 게시물을 발견했지만 내가 레코드의 동일한 금액을 돌려받을 수 없지만, 제목으로 더 많은 것을 반환합니다.

SELECT DISTINCT MAX(EV_ID) As EV_ID, ev.EV_Title, EV_ContactEmail, EV_CusName 
FROM tblEvents ev 
INNER JOIN tblCustomers cus ON cus.CUS_ID = ev.EV_CustomerID 
INNER JOIN (
    SELECT EV_Title, MAX(EV_ID) AS MaxID 
    FROM tblEvents 
    GROUP BY EV_Title 
) groupedev ON ev.EV_Title = groupedev.EV_Title AND ev.EV_ID = groupedev.MaxID 
WHERE (
    CUS_IsAdmin = 'y' 
    AND CUS_Live = 'y' 
    AND EV_Live = 'y' 
    AND EV_EndDate >= '2012/7/5 12:00:00 AM' 
    AND EV_ContactEmail <> '' 
) 
GROUP BY EV_ContactEmail, ev.EV_Title 

누구에게 잘못 되었나요?

+1

당신은 또한 – Kshitij

답변

1
SELECT e.EV_ID, e.EV_ContactEmail, e.EV_CusName 
FROM 
     events AS e 
    INNER JOIN 
     (SELECT MAX(EV_ID) As EV_ID 
      FROM tblEvents ev 
      INNER JOIN tblCustomers cus 
       ON cus.CUS_ID = ev.EV_CustomerID 
      WHERE CUS_IsAdmin = 'y' 
      AND CUS_Live = 'y' 
      AND EV_Live = 'y' 
      AND EV_EndDate >= '20120705T00:00:00' --- notice the unambiguous 
      AND EV_ContactEmail <> ''    --- datetime format 
      GROUP BY EV_ContactEmail 
     ) AS tmp 
     ON tmp.EV_ID = e.EV_ID ; 
+0

이 쿼리는 완벽하게 작동합니다, 당신은 나쁜 금요일 오후를 보내지 못하게했습니다! 매우 감사합니다. – DAC84

2

이와 비슷한?

SELECT DISTINCT EV_ID, EV_ContactEmail, EV_CusName, EV_Title 
FROM tblEvents ev 
    INNER JOIN tblCustomers cus 
     ON cus.CUS_ID = ev.EV_CustomerID 
    INNER JOIN (SELECT MAX(EV_ID) AS MaxID 
       FROM tblEvents 
       GROUP BY EV_ContactEmail) sub 
     ON ev.EV_ID = sub.MaxID 
WHERE CUS_IsAdmin = 'y' 
    AND CUS_Live = 'y' 
    AND EV_Live = 'y' 
    AND EV_EndDate >= '2012/7/5 12:00:00 AM' 
    AND EV_ContactEmail <> '' 
+0

그레이트,이 첫 번째 쿼리가 하나의 관리 (고객으로 EV_ContactEmail에 의해 그룹화에 정확하지만 잘 보이는 당신의 DB 구조를 제공 할 수 있습니다) 다른 사람을 대신하여 게시 할 수 있습니다 . 고유 한 EV_ContactEmail의 총 수보다 적은 수의 행을 24 개 반환합니다. 왜 그런지 테스트하는 방법이 있습니까? – DAC84

+0

네, 저에게 좋습니다. 왜 나는 이메일을 선택하는 별개의 쿼리를 기반으로 예상보다 24 적은 레코드가 있는지 알고 싶습니다. 639 개의 고유 한 전자 메일이 있지만이 쿼리는 615 개의 레코드를 반환합니다. – DAC84

+0

그래서 SELECT DISTINCT EV_ContactEmail FROM tblEvents 쿼리는 639 개의 레코드를 반환합니까? –

0

대신 distinct, 당신은 EV_ContactEmail, EV_CusName, EV_ID desc에 의해 처음으로 주문을 할 수있는 다음 그룹 다른 모든 열은

SELECT MAX(EV_ID) As EV_ID, EV_ContactEmail, EV_CusName 
FROM 
(
    SELECT EV_ID As EV_ID, EV_ContactEmail, EV_CusName 
    FROM tblEvents ev 
    INNER JOIN tblCustomers cus ON cus.CUS_ID = ev.EV_CustomerID 
    WHERE (  
     CUS_IsAdmin = 'y'  
     AND CUS_Live = 'y'  
     AND EV_Live = 'y'  
     AND EV_EndDate >= '2012/7/5 12:00:00 AM'  
     AND EV_ContactEmail <> ''  
    ) 
    ORDER BY EV_ContactEmail, EV_CusName, EV_ID DESC -- you can add title also here before ev_id 
) 
GROUP BY EV_ContactEmail, EV_CusName -- if you need title in query, also add title here 
+0

이것은 불행하게도 작동하지 않았습니다. 단순히 많은 복사본을 가진 레코드 세트를 주문합니다. – DAC84

+0

'ORDER BY'가'GROUP BY' 다음에 나온다 –

+0

@DeanCarslake 나는 모든 레코드를 그룹화하기 위해 그 부분을 놓쳤다 고 생각한다. 쿼리를 수정했습니다. 이 잘 작동합니다. – Kshitij

0

'왼쪽 외부 조인'에 '내부 조인'으로 변경하십시오
하는 DISTINCT SELECT MAX (EV_ID) EV_ID, EV_ContactEmail, EV_CusName
발신 tblEvents ev
왼쪽 외부 조인 tblCustomers cus ON cus.CUS_ID = ev.EV_CustomerID
WHERE (
CUS_IsAdmin = 'Y'
AND
AND EV_Live가 = 'Y'
AND EV_EndDate> = '2012년 7월 5일 오전 12시 0분 0초'
EV_ContactEmail CUS_Live AND = 'Y' EV_ContactEmail
BY <은> ''
) 그룹

+0

관리자 전용 레코드가 필요하므로 내부 조인이어야하므로 IsAdmin = 'y'필터를 사용해야합니다. – DAC84

관련 문제