2017-03-07 5 views
1

제목은 내가 찾고있는 것이 아니지만 쿼리하는 방법에 대한 다른 아이디어를 찾고있을 수도 있습니다.SQL 서버의 레코드로 레코드 전 환

나는 다음과 같은 테이블이 있습니다

items (itemID, upc, name) 
levels (levelID, desc) 
levelGrp (levelGrpID, levelID, desc) 
levelGrp_Intersection (itemID, levelID, levelGrpID) 

레벨 테이블이 불과 3 레코드가있는 것 : 그래서

{ 545, 1, Beverages } 
, { 546, 2, Alcohol } 
, { 547, 3, Beer } 

:

{ 1, Department } 
, { 2, Category } 
, { 3, Sub-Category } 

levelGrp 테이블이 적절한 수준을 가지고 설명을 정의를 당신은 상관 관계를 볼 수 있습니다. 한 부서는 음료라고합니다. 하나의 카테고리는 알코올이라고 부르며 하나의 하위 카테고리는 맥주라고합니다. 당신이 가진 것, 그래서

이제 levelGrp_Intersection 테이블은 각각의 항목을 추가합니다 :

{ 100, 1, 545 } 
{ 100, 2, 546 } 
{ 100, 3, 547 } 

그래서이 말한다 : 문제는 지금이 쿼리됩니다

item 100 has its Department as Beverages 
item 100 has its Category as Alcohol 
item 100 has its Sub-Category as Beer 

. 부서, 카테고리 및 하위 카테고리가 각 항목에 대해 무엇이 가장 좋은지 알고 싶습니다.

이 정보를 얻으려면 select 문에서 subselect를 수행 할 수 있지만 subselect는 일반적으로 나쁜 것으로 간주되므로 (내 이해에서) 내 다른 옵션은 무엇입니까?

이상적으로 나는 각 항목에 대해 단지 1 행을 원할 것입니다. 그리고 우리는 Department, Category, Sub-Category에 대한 열을 만들 것입니다.이 열은 실제로 테이블에있는 레코드입니다. 우리가이 레코드를 가져 와서 열로 변환하는 것과 같습니다. levelGrp에는 약 700 개 이상의 레코드가 없으므로 실제로 회전 할 수있는 옵션은 이고 동적 SQL은 없습니다.

아이디어가 있으십니까?

+0

에는 요동없이 동적 = 아니오 도넛. 호출자 애플리케이션에서 피벗 할 수 있습니까? 그리고 SQL Server 버전은 무엇입니까? –

+0

2012. 발신자 앱에서 피벗이 없습니다. 이 작업을 수행하는 proc에서 반환하는 데이터는 예외없이 데이터를 전달합니다. 어쩌면 선회를 할 수 있을까요? 나는 우리가 레벨 (1, 2, 3)을 코딩 할 때 하드 코딩한다는 것을 의미하지만, 너무 많은 레코드 (700+)를 가진 levelGrp에 합류하고 그 값을 하드 코딩하고 싶지는 않지만, 1, 2, 3 값과 우리는 levelGrp 테이블에서 설명을 얻을 수 있습니까? 나는 그것이 어떻게 작동하는지 생각할 수 없다. – user441521

답변

1

공지 레벨 이름 조건부 응집을 사용하지 :

select 
    lgi.item 
    , Department = max(case when levelid = 1 then lg.[desc] end) 
    , Category = max(case when levelid = 2 then lg.[desc] end) 
    , Subcategory = max(case when levelid = 3 then lg.[desc] end) 
from levelGrp_Intersection lgi 
    inner join levelGrp lg 
    on lg.levelGrpId = lgi.levelGrpID 
group by lgi.item 
+0

매력처럼 작동했습니다! 고맙습니다! – user441521

+0

@ user441521 도와 드리겠습니다! – SqlZim

관련 문제