2014-05-20 2 views
0

SQL Server 데이터베이스에 다음 두 테이블이 있습니다.두 테이블에서 SQL Select 쿼리

Customer 테이블 :

CID(PK) 
Customer_Name 
Region 
Product  

Server 테이블 :

S_NO(PK) 
CID(FK) 
Server_Name 
Environment 

내가 테이블에서 Customer_Name,Region,Product,Server_Name,Environment을 선택합니다.

1 AEON APAC SCPO AEPRDCSG1 Production 
2 AEON APAC SCPO AEPRDXEN1 Production 

하지만 내 원하는 출력은 다음과 같습니다 :

1 AEON APAC SCPO AEPRDCSG1 Production 
        AEPRDXEN1 Production 

는 사람이 도와 드릴

내 쿼리 내가 아니라 내 출력을 얻을

SELECT Customer,Region,Product,Server.Server_Name,Server.Environment 
FROM Customer INNER JOIN Server ON Customer.C_ID=Server.C_ID; 

입니까?

답변

1

난 당신이 데이터의 형식을 응용 프로그램/디스플레이 레이어를 사용해야 토니 동의 : 당신은 당신이 당신의 SQL을 수정해야 할 첫 번째 라인을 얻을합니다. 당신은 SQL에서 그것을 할 원한다면 당신이 맘에 수 있습니다

;WITH cte AS (
    SELECT Customer,Region,Product,[SERVER].Server_Name,[SERVER].Environment 
      , ROW_NUMBER() OVER (PARTITION BY Customer,Region,Product ORDER BY [SERVER].Server_Name,[SERVER].Environment) AS Ord 
    FROM Customer 
      INNER JOIN [SERVER] ON Customer.C_ID=[SERVER].C_ID 
) 
SELECT CASE WHEN Ord = 1 THEN Customer END AS Customer 
     , CASE WHEN Ord = 1 THEN Region END AS Region 
     , CASE WHEN Ord = 1 THEN Product END AS Product 
     , Server_Name, Environment 
FROM cte 
ORDER BY cte.Customer, cte.Region, cte.Product, Ord; 
+0

두 번째 고객이 있으면이 부분이 중단되지 않습니까? –

+0

나는 그렇게 생각하지 않는다. .. 어떤 점에서?Row_Number 함수의 Partition 절은이를 처리해야합니다. –

+0

두 고객이 올바르게 작동하지 않으므로 쿼리를 테스트하기 위해 [SQL Fiddle] (http://sqlfiddle.com/#!3/efe81a/1)을 만들었습니다. – Tony

1

출력을 SQL로 형식화하지 마십시오.

데이터베이스가 데이터를 저장하면 응용 프로그램/프리젠 테이션 계층에 데이터가 표시됩니다. 응용 프로그램 계층에서 서식을 지정하십시오.

+0

웹 사이트 응용 프로그램에서 어떻게해야합니까? –

+0

웹 응용 프로그램에서 사용중인 라이브러리에 따라 다르므로 여기서 대답하는 데 너무 광범위합니다. – Tony

0

토니는 바로,하지만 난 그래서 그것을 해결거야 도전으로 볼 : 음

SELECT 
    CASE WHEN RN = 1 THEN Customer ELSE '' END AS Customer, 
    CASE WHEN RN = 1 THEN Region ELSE '' END AS Region, 
    CASE WHEN RN = 1 THEN Product ELSE '' END AS Product, 
    Server.Server_Name,Server.Environment 
FROM (
    SELECT Customer,Region,Product,Server.Server_Name,Server.Environment 
     ROW_NUMBER() OVER (PARTITION BY Customer,Region,Product ORDER BY Server.Server_Name) as RN 
    FROM Customer 
    INNER JOIN Server ON Customer.C_ID=Server.C_ID; 
) sub 
-1

,

를 내가 서버 테이블

고객의 두 항목이 있다고 가정 이름 : "AEON", 지역 : "APAC", 제품 : "SCPO"

따라서 2 줄을 얻습니다.

Select TOP 1 Customer,Region,Product ,Server.Server_Name,Server.Environment from Customer inner join Server on Customer.C_ID=Server.C_ID; 
+0

원하는 출력은 첫 번째 네 개의 필드에서 반복 된 정보를 제거하는 것이지 한 행만 반환하는 것은 아닙니다. – Tony

1

결과 세트가 관계하지 않기 때문에 내가 SQL에서 서식이 유형을하는 팬이 아닙니다. 주어진 행의 정의는 그 옆에있는 행에 따라 달라 지므로 테이블과 결과 집합의 정렬되지 않은 특성을 위반합니다. 말했다

, 당신은 SQL에서이 작업을 수행 할 수 있습니다 : 당신이 정확하게 결과를 해석 할 수 있도록하려면

SELECT (case when seqnum = 1 then Customer end) as Customer, 
     (case when seqnum = 1 then Region end) as Region, 
     (case when seqnum = 1 then Product end) as Product, 
     Server_Name, Environment 
FROM (SELECT Customer, Region, Product, s.Server_Name, s.Environment, 
      row_number() over (partition by customer, region, product order by s.server_name) as seqnum 
     FROM Customer c INNER JOIN 
      Server s 
      ON c.C_ID = s.C_ID 
    ) t 
ORDER BY Customer, Region, Product, Server_Name; 

마지막 order by은 매우 중요하다.

관련 문제