2013-07-17 3 views
1

그래서 나는이 같은 테이블을 보이는이있는이여러 행이

ID | region | thing | foo | bar 
-------------------------------------------- 
1 | region1 | thing1 | NULL | NULL 
2 | region2 | NULL | foo1 | bar1 
3 | region2 | NULL | foo2 | NULL 
4 | region3 | NULL | NULL | NULL 

:

내가 필요로 무엇
ID | parentID | name | typeID 
--------------------------------------- 
1 |  2  | thing1 | 1 
2 |  4  | region1 | 0 
3 |  4  | region2 | 0 
4 |  NULL | region3 | 0 
5 |  3  | foo1 | 2 
5 |  3  | foo2 | 2 
6 |  3  | bar1 | 3 

는이처럼 출력입니다

Select ID, 
    (CASE WHEN [typeID] = 0 THEN [name] END) AS region, 
    (CASE WHEN [typeID] = 1 THEN [name] END) AS thing, 
    (CASE WHEN [typeID] = 3 THEN [name] END) AS foo, 
    (CASE WHEN [typeID] = 5 THEN [name] END) AS bar 
FROM [my].[dbo].[foobarthingtable] 
where type = 0 OR type = 1 OR type = 3 OR type = 5 

(부모) 영역과 같은 행에있는 "foos", "bars"및 "things"를 어떻게 얻을 수 있습니까? JSF 페이지에 개요로 표시해야하므로 JPA 방식 (CriteriaQuery)도 좋습니다.

당신이 그룹은 ID에 의해 결과 집합해야 이제

답변

1

을 사용하려고 할 수 있습니다, 나는 그것을있어

;With NumberSequence(Number) as 
(
    Select 1 as Number 
     union all 
    Select Number + 1 
     from NumberSequence 
     where Number < 100 
), 
base_list AS (
    SELECT 
     ISNULL(t2.name, t1.name) as Region, 
     t1.name, 
     t1.typeid 
    FROM foobarthingtable t1 
    LEFT JOIN foobarthingtable t2 ON t1.[parentID]=t2.id AND t2.typeID = 0 
) 
SELECT 
    ROW_NUMBER() OVER (ORDER BY reg_list.Region, reg_list.Number) as ID, 
    reg_list.Region AS region, 
    thing_list.name AS thing, 
    foo_list.name AS foo, 
    bar_list.name AS bar 
FROM (
    SELECT 
     t1.Region, 
     NumberSequence.Number 
    FROM (
     SELECT DISTINCT 
      ISNULL(t2.name, t1.name) as Region 
     FROM foobarthingtable t1 
     LEFT JOIN foobarthingtable t2 ON t1.[parentID]=t2.id AND t2.typeID = 0 
     WHERE t1.typeID in (0,1,2,3,5) 
    ) t1 
    CROSS JOIN NumberSequence 
) as reg_list 

LEFT JOIN (
    SELECT 
     bl.Region, bl.name, ROW_NUMBER() OVER(ORDER BY bl.Region, bl.name) rn 
    FROM base_list bl 
    WHERE typeID =1 
) thing_list ON thing_list.Region=reg_list.Region AND reg_list.number=thing_list.rn 

LEFT JOIN (
    SELECT 
     bl.Region, bl.name, ROW_NUMBER() OVER(ORDER BY bl.Region, bl.name) rn 
    FROM base_list bl 
    WHERE typeID =2 
) foo_list ON foo_list.Region=reg_list.Region AND reg_list.number=foo_list.rn 

LEFT JOIN (
    SELECT 
     bl.Region, bl.name, ROW_NUMBER() OVER(ORDER BY bl.Region, bl.name) rn 
    FROM base_list bl 
    WHERE typeID =3 
) bar_list ON bar_list.Region=reg_list.Region AND reg_list.number=bar_list.rn 

WHERE thing_list.name is not null or foo_list.name IS NOT NULL OR bar_list.name IS NOT NULL OR reg_list.Number=1 

ORDER BY  reg_list.Region, reg_list.Number 
+0

매우 감사합니다! 마침내 마술을했습니다! –

1

들으은

SQLFiddle demo

WITH CTE AS 
(
Select 

    (case when [typeID]=0 then ID ELSE parentID END) as ID, 


    (CASE WHEN [typeID] = 0 THEN [name] END) AS region, 
    (CASE WHEN [typeID] = 1 THEN [name] END) AS thing, 
    (CASE WHEN [typeID] = 3 THEN [name] END) AS bar, 
    (CASE WHEN [typeID] = 2 THEN [name] END) AS foo 
FROM foobarthingtable 
where typeid in (0,1,3,2) 
) 

select id, 
MAX(REGION) REGION, 
MAX(THING) THING, 
MAX(FOO) FOO, 
MAX(BAR) BAR 
from CTE group by id 
+0

결과에서 ID = 1을 잃어 버렸습니다. –

+0

당신, 선생님, 마을에서 가장 멋진 커피를 마실 가치가 있어요! 매력처럼 작동합니다! 정말 고마워! –

+0

BTW : 나는 단지 하나의 영역에 대해 하나, foo 및 bar 만 얻는다는 것을 깨달았습니다. 그래서 하나의 지역에 여러 가지/foos/bars가 있다면 하나만 표시합니다. 내 질문에 두 번째 테이블 : ID 4 행이 표시되지 않습니다 ... –

1

당신은 PIVOT 문 마지막으로

;WITH PivotData AS 
(
SELECT 
    ISNULL(t2.name, t1.name) as ParentRegion, -- grouping column 
    t1.name, -- aggregation column 
    CASE t1.typeid 
     WHEN 1 THEN 'thing' 
     WHEN 2 THEN 'foo' 
     WHEN 3 THEN 'bar' 
    END as mycolumn -- spreading column 
FROM foobarthingtable t1 
LEFT JOIN foobarthingtable t2 ON t1.[parentID]=t2.id AND t2.typeID = 0 
WHERE t1.typeID in (0,1,2,3,5) 
) 
SELECT ParentRegion, [thing], [foo], [bar] 
FROM PivotData 
PIVOT(MAX(name) FOR mycolumn IN ([thing], [foo], [bar])) AS P 
ORDER BY ParentRegion; 
+0

회신에 대한 thx 있지만 예상대로 작동하지 않습니다. 마지막 테이블에 각 테이블, foo 및 bar에 대한 행을 추가했습니다. –

+1

ParentRegion –

+0

thx에 대한 답변을 수정했습니다! 약간의 수정을 거친 후 거의 필요한대로 작동합니다 : "LEFT JOIN foobarthingtable t2 ON t1. [parentID] = t2.id 및 t2.typeID = 0 여기서 t1.typeID in (0,1,3,5)" TypeID = 0 우리는 커스텀 지역 이름을 가지고 있기 때문에. 그리고 나는 결과를 지역별로, 다음으로 사물별로, 그리고 술집별로 주문했습니다.별로 중요하지 않습니다. 왼쪽 문제는 다음과 같습니다. 지역 및 사물 OR 영역과 foo OR 영역 및 바가 연속적으로 있습니다. 그래서 region2에 물건과 foo와 bar가 있다면, 그것은 하나의 행에 region, thing, foo와 bar가있는 1 대신에 같은 region에 대해 3 개의 별도의 행을줍니다 ... –

관련 문제