2012-05-17 4 views
1
Customers 
id,name,orderid 
---------------------- 
1,Ted, 1 
2,Jen, 2 

Orders 
id,prodname 
---------------------- 
1,widgetA 
1,widgetC 
2,widgetB 
2,widgetA 


desired results 
name, prodname 
---------------------- 
Ted, widgetA 
' ', widgetC 
Jen, widgetB 
' ', widgetA 

기본적으로 두 개 이상의 제품이있는 고객의 이름을 반복하고 싶지 않습니다. 이것을 할 수있는 방법이 있습니까?SQL 쿼리에서 중복 레코드를 표시하지 않습니다.

솔루션 :

Select 
    (CASE WHEN myrow=1 THEN Name ELSE ' ' END) AS Name, 
    product 
From 
(
    Select 
     ROW_NUMBER() OVER (PARTITION BY c.Name ORDER BY c.Name) AS myrow,  
     o.productname AS product 
    FROM 
     Customers c JOIN 
     Orders o ON c.orderid = o.id 
) T1 

Order By Name 
+4

당신은 확실히 데이터베이스 수준 – Lamak

+1

@Lamak에없는 디스플레이 층에서이 작업을 수행해야을 SQL Reporting Services 보고서 내에서 사용하도록 설정된 결과 – Sung

+1

커서를 사용한다고하지만 커서를 사용하는 솔루션을 생각해 내는데 게으름 뱅이가 됨 – Sung

답변

1

귀하의 질문에 답하기 위해 다른 해결책을 사용하는 것이 중요합니다. SQL Server를 사용하는 경우 "row_number()"를 살펴보십시오. 당신이 반환하는 경우 그러나 당신은이 작업을 수행 할 싶어 수 있습니다 나는 SQL 서버를 사용하지 않는,하지만은 다음과 같이 보일 수 있습니다 :

Select 
    ROW_NUMBER() OVER (ORDER BY c.Name) AS myrow, 
    if(myrow=1,name,' ') AS name, 
    o.productname AS product 
FROM 
    Customers c JOIN 
    Orders o ON c.orderid = o.id 
+0

그것은 TSQL을 준수하지는 않지만 그러한 구문이 TSQL에서 허용 될 수 있기를 바랍니다. – Sung

+0

row_number 함수를 소개하기 위해 투표를해야합니다 (이 상황에서 사용하지 않아도됩니다). – Limey

+0

은 sql이 하위 선택을 제공하도록하여 작동하도록하고 container SQL에 if (cond, true, false) CASE 문을 배치합니다. – Rod

1

첫째, 여기에 모호함이있다. 두 개의 테드가 있다면 어떻게 될 것으로 예상합니까?

실행중인 서버에 따라 다르지만 SQL을 사용하여이 작업을 수행 할 가능성이 큽니다. 그래도 강력히 조언합니다. 지나치게 복잡하게 된 항목에 대해 단일 조인 (인덱스가 적절하게 설정되었다고 가정)을 사용하여 간단하고 효율적인 쿼리를 수행 할 수 있습니다.

정말로 디스플레이/소비자 측에서 원하는 것이 무엇인지 알아야합니다. 당신은 의심의 여지없이 해결책을 얻지 만 표준 결합으로 갈 것입니다. 또한 앞에서 설명한 모호성을 피하기 위해 출력에 고객 ID를 추가합니다.

+0

포인트를 받았습니다, 모두에게 감사드립니다. – Rod

관련 문제