2014-01-17 6 views
0

이 질문에 더 좋은 레이블이 지정되지 않았 음을 사과 드리며 예제없이 설명하는 방법을 모르겠습니다. 여기 내가 성취하려고하는 것이 있습니다.재귀 SQL 열 하위 선택

내 간체 데이터 :

내가 좋아하는 2 열에서 데이터를 반환하는 쿼리를 작성해야
ID ParamName ParamValue 
----------------------- 
1 'Item Code' '100' 
1 'Amount'  '.99' 
2 'Item Code' '555' 
2 'Amount'  '1.99' 
2 'Item Code' '200' 
2 'Amount'  '2.99' 
2 'Item Code' '221' 
2 'Amount'  '.89' 

등 (단일 ID에 대해 여러 값은 해당 항목의 코드를 가정하고 금액은 주문한다는 점에서 일치하는 경우

ItemCode Amount 
----------------------- 
'100'  '.99' 
'555'  '1.99' 
'200'  '2.99' 
'221  '.89' 

이 내가 올 수있는 가장 가까운,하지만 같은 ID로 여러 항목 코드가있는 경우 나) (최대()와 합계로 그룹에 싶지 않은 : 그들은) 테이블에 있습니다. 나는 어떤 종류의 재귀가 필요하다고 가정하고 있지만 어디에서 연구를 시작할 지조차 모른다.

select 
(Select Max(ParamValue) from EventDetail where id = base.id and ParamName = 'Item Code') as ItemCode, 
(Select Sum(ParamValue) from EventDetail where id = base.id and ParamName = 'Amount') as Amount 
from 
(
    select distinct id from EventDetail 
) base 

SQL 바이올린 : http://sqlfiddle.com/#!2/09b773/1/0

는 볼 주셔서 감사합니다!

+1

현재 행 3 행 4, 5 행으로가는 것을 이해하는 방법이 될 것 같지 않습니다 : 우리가 다음을 수행 위와 같이 myOrder이 열을 호출하는가는

그룹화를 얻으려면 6 번 행 등이 있습니다. 테이블의 다른 열? 그렇지 않다면 예측 가능하고 결정론적인 방식으로 해결할 수 있다는 것을 모릅니다. 인덱스를 추가하는 것과 같은 방법으로 SQL Server가 이러한 행을 정렬하는 방법을 결정할 수 있습니다. –

+0

불행히도 행을 서로 연결하는 다른 열은 없습니다. 이 시점에서 나는 그들이 순차적으로 삽입되었다는 가정을해야한다. (나는 이것도 싫어한다.) 당신이 맞아요, 인덱스 변경 완전히 이것을 망칠 수 있습니다. – koolaide

+1

행을 검색하는 순서가 변경되지 않는다는 가정과 동일하게 데이터 모델을 수정하거나 죄송합니다. 또는 클라이언트에이 정보를 조 변경해야합니다. 관계형으로 원하는 것을 표현할 방법이 없습니다. 테이블은 정의에 따라 정렬되지 않은 행 모음입니다. "순차적으로 삽입"에 대한 가정을 할 수는 없습니다. 이것은 관계형 데이터베이스가 작동하는 방식이 아닙니다 (하지만 Access와 같은 장난감에서 벗어날 수 있습니다). –

답변

0

먼저 합치는 아이템 코드와 아이템 금액을 그룹화하는 간단한 방법을 생각해 보겠습니다. 같을 것이다

그래서 데이터 : 귀하의 경우 이제

ID ParamName ParamValue 
----------------------- 
1 'Item Code' '100' 
1 'Amount'  '.99' 
2 'Item Code' '555' 
2 'Amount'  '1.99' 
3 'Item Code' '200' 
3 'Amount'  '2.99' 
4 'Item Code' '221' 
4 'Amount'  '.89' 


WITH uniqueRowID AS 
(
    SELECT DISTINCT ID 
    FROM myTable 
) 
SELECT uniqueRowID, Item.ParamValue as Item, Amount.ParamValue as Amount 
FROM uniqueRowID 
JOIN myTable as Item ON uniqueRowID.ID = Item.ID AND Item.ParamName='Item Code' 
JOIN myTable as Amount ON uniqueRowID.ID = Amount.ID AND Amount.ParamName='Amount' 

, 당신은 항목을 주문 할 수있는 방법이 필요합니다 - 당신은 당신의 테이블에이를 추가해야 할 수도 있습니다 - 난 이

WITH item AS 
(
    SELECT ParamValue, 
      ROW_NUMBER() OVER (ORDER BY myOrder) as rn 
    FROM myTable 
    WHERE ParamName = 'Item Code' 
), amount AS 
(
    SELECT ParamValue, 
      ROW_NUMBER() OVER (ORDER BY myOrder) as rn 
    FROM myTable 
    WHERE ParamName = 'Amount' 
) 
SELECT item.ParamValue as ItemCode, amount.ParamValue as Amount 
FROM item 
JOIN amount ON item.rn = amount.rn 
+0

@AaronBertrand - 그래, 나는 그것을보고 내 대답을 향상. – Hogan

+0

감사합니다. 나는 "InsertedDate"란을 간과했다. 나는 이것이 정렬을 위해 작동한다고 믿습니다. – koolaide

+0

@koolaide 다른 칼럼을 발견하는 데 30 분이 걸렸습니까? 다음에 관련성이있는 것으로 생각되는 열 대신 테이블의 스키마를 제공하십시오. –