2016-07-05 2 views
0

SQL Server 2000 사용 - 이전 데이터베이스가 있으며 정규화되지 않았습니다.정규화되지 않은 열로 그룹화

그것은 이러한 열은 여기에 숫자 샘플을 포함

memId 
c1 
c2 
c3 
c4 
c5 

같은 열을 잔뜩 가지고

내가 원하는이

처럼 memId 및 열 이름으로 그룹화 된 데이터를 추출하는 것입니다
123 
10 
20 
0 
40 
0 

123 
0 
20 
0 
40 
5 

memId col total 
123 c1 10 
123 c2 40 
123 c4 80 
123 c5 5 

숫자가 그룹의 합계입니다.

나는 각각의 시간을 가져 와서 모두 조합 할 수 있다고 생각했지만 더 쉬운 방법이 있는지 궁금해하고있었습니다.

+0

피벗을 사용하면 .....? –

+0

그것의 SQL 2000 DB와 unpivot가 지원되지 않는 것 같습니다 –

+6

사람들은 여전히 ​​SQL2000을 사용합니까?! 조문 ... – DavidG

답변

1

당신이 좋아하는 것 같습니까? unpivot 결과. 데이터베이스에 대한 하나의 옵션은 union all 다음과 같습니다

select memId, 'c1' as col, sum(c1) from yourtable group by memId, col 
union all 
select memId, 'c2' as col, sum(c2) from yourtable group by memId, col 
union all 
select memId, 'c3' as col, sum(c3) from yourtable group by memId, col 
union all 
select memId, 'c4' as col, sum(c4) from yourtable group by memId, col 
union all 
select memId, 'c5' as col, sum(c5) from yourtable group by memId, col 
+0

예.이 질문에 "나는 각 시간을 가져 와서 함께 결합 할 수 있다고 생각했습니다." –

+0

@sgeddes 실제로 GROUP BY를 사용하는 것은 매우 위험합니다. 논리적으로 select 문 앞에 있기 때문에 쿼리가 실패합니다. –

-1

내가 죄송합니다, 당신의 지점을 오해 보인다. 정보를 다른 테이블로 마이그레이션하고 있습니까?

하지만 먼저, 용어 정상화

First Normal Form 
- Eliminate repeating groups in individual tables. 
- Create a separate table for each set of related data. 
- Identify each set of related data with a primary key. 

의 내 사용에 대한 메모 그래서 분명 나는 정상화에 대해 잘못이었다. 아참. 좋은 물건 나는 아직도 젊다. 그렇지? :/

나는 이것을 재평가하는데 (치명적인 실수는 아니겠습니까?) 그리고 SQL Server 2000의 한계는 무엇입니까? redware - SQL SERVER Handbook에서 유용한 SQL Server 2000 설명서 컴파일을 발견했습니다.

표 표현식에서 나타나는 유일한 사실은 subqueriesviews입니다. 단, 진정한 순위 지정 기능을 사용할 수는 없지만 (고맙게도 Functions을 만들 수 있습니다).

의 경우 일종의 필기체를 통해 값을 추가 할 수 있습니까?

  • 당신은 여전히 ​​#Columns은 피봇 팅 할 테이블을 적어도 N X를 분석 할 것입니다. 아니 복잡한 피벗 (어쨌든 존재하지 않았다) 필요합니다.
  • 값 비싼 필기체를 사용하는 대신 SELECT 'C1'은 간단하고 쉽게 행을 수정할 수 있습니다.
  • 테이블을 연결하려는 경우 가장 간단한 방법은 여전히 ​​UNION ALL입니다.
  • 연결 후 GROUP BY를 한 번 실행할 수 있습니다.간단하고 우아한.

해결책 :

SELECT memID 
    , Col 
    , SUM(C1) AS Count 
FROM (
     SELECT 'C1' AS [Col], memID, C1 FROM #Test2 
     UNION ALL SELECT 'C2' AS [Col], memID, C2 FROM #Test2 
     UNION ALL SELECT 'C3' AS [Col], memID, C3 FROM #Test2 
     UNION ALL SELECT 'C4' AS [Col], memID, C4 FROM #Test2 
     UNION ALL SELECT 'C5' AS [Col], memID, C5 FROM #Test2) AS A 
GROUP BY memID, Col 
ORDER BY memID ASC, Col ASC 

소스 테이블 :

CREATE TABLE #Test2 (memID INT, C1 INT, C2 INT, C3 INT, C4 INT, C5 INT) 
INSERT INTO #Test2 (memId, C1, C2, C3, C4, C5) 
VALUES (123, 10, 20, 0, 40, 0) 
    , (123, 0, 20, 0, 40, 5) 
    , (122, 5, 20, 10, 15, 0) 
    , (122, 5, 0, 0, 0, 60) 
    , (155, 10, 0, 0, 10, 10) 
    , (155, 0, 0, 0, 50, 50) 

결과 :

memID Col Count 
122  C1 10 
122  C2 20 
122  C3 10 
122  C4 15 
122  C5 60 
123  C1 10 
123  C2 40 
123  C3 0 
123  C4 80 
123  C5 5 
155  C1 10 
155  C2 0 
155  C3 0 
155  C4 60 
155  C5 60 

그래서 처음 아이디어가 옳았다 고 생각합니다. 건배.

+0

이미 해당 형식의 데이터가 있는데, 필자가 제공 한 예제에 따라 각 열이 하나의 행이되도록해야합니다. –

+0

@DaleFraser가 업데이트 된 응답을 참조하십시오. 의견. 확실히 나쁜 지식을 주장하고 싶지 않아! –

관련 문제