2011-10-08 2 views
0

나는이 일반적인 형식의 테이블을 가지고 있습니다. 그것은 피벗을 통해 생성되었으므로 열의 수가 고정되지 않습니다. 제가mysql은 한 열의 값으로 모든 열을 나눕니다 (벡터 계산 등)

필요한
id c1 c2...   total 
10 0 2 1 1 0 4 
9 0 1 0 1 0 2 
8 1 2 0 0 0 3 
7 0 0 0 1 0 1 
6 0 1 0 1 1 3 
5 1 0 0 1 2 4 
4 0 1 1 0 0 2 
3 0 3 0 1 1 5 
2 2 2 2 0 0 6 
1 1 0 1 0 0 2 

은 "총 COL"를 (마지막 왼쪽) 수행하고, 각각의 전체로 {C1, C2, C3 ...} 열의 각 분할하는 것이다 .. 예를 들어 행 10, c2 = 2이면 c2/total = 2/4 = 0.5

강조하기 만하면됩니다. 고정되어 있지 않습니다. 이것은 샘플 표입니다.

mysql을 통해서만 가능하거나 외부 스크립트가 필요합니까?

많은 감사

편집이 명확히하기 위해 :, 두 번째는 "C가

첫 COL은"ID "입니다
2 2 
8 1 
2 2 
1 5 
3 1 
9 1 
5 3 
4 1 
1 2 
10 5 
6 4 
4 5 
5 2 
10 3 
5 4 
3 1 
6 1 
6 3 
3 4 
3 1 
5 4 
7 3 
2 5 
10 1 
9 3 

입니다 :

내 inital 데이터를 미리 회전을 다음과 같습니다 ". 도시 된 바와 같이, 그것은 우연히 정렬의 우발적 인 테이블로 변형 될 필요가있다. 각각의 ID에는 각 "c"{c1, c2, c3 ...}에 대한 개수가 있습니다.

이 데이터를 아래에 언급 된 @bobwienholt 형식으로 코딩하는 효율적인 방법이 있습니까? (나는 mysql을 처음 사용하는데, 실제로는 피봇 팅을 위해 오늘 나 자신에게 가르쳤다.

SELECT d.row, d.col, d.value/t.total 
FROM (
    SELECT row, SUM(value) as total 
    FROM data 
    GROUP BY row; 
) t INNER JOIN data d 
ON d.row = t.row 
ORDER BY row, col; 

그것은 "행"과 "열 중 수를 작동합니다 :

CREATE TABLE data (row INT, col INT, value INT); 

이 그럼 당신은이 작업을 수행 할 수 있습니다 내가 당신이라면 다음과 같이

+0

피벗하기 전에이 작업을 수행 할 수 있습니까? –

+0

나는 십자가 합계를 미리 얻어야하기 때문에 나는 믿지 않는다? 아마 내가 잘못 본거야? – mrquestion

+0

@MarkByers 어떤 제안이 있습니까? – mrquestion

답변

1

, 내 테이블을 구성 할 ".

+0

밥 @ bobwienholt,하지만 당신이 할 수 있다면 내가 필요한 설명을 주셔서 감사합니다 ... 내 질문에 편집을 참조하십시오. 많은 감사. – mrquestion

+0

제안 사항이 있으십니까? – mrquestion

0

좋아요, 편집 내용에 따라 ... 나는 그대로 데이터를 가져옵니다. 따라서 다음과 같은 표를 작성하십시오.

CREATE TABLE data (id INT, c INT); 

그러면 LOAD DATA INFILE을 사용하여 데이터를 가져올 수 있습니다. 그것을 사용하는 법을 배우려면 MySQL 문서를 참고해야한다.

그런 다음 모든 C1, C2를 얻을 것 등은 다음과 같이 계산 :

SELECT id, c, COUNT(1) as num 
FROM data 
GROUP BY id, c; 
(샘플 데이터 기준)과 같은 결과를 얻을 것이다

: 그래서

id  c  num 
1  2  1 
1  5  1 
2  2  2 
2  5  1 
3  1  3 

을, 기본적으로 등 ID 2 C2 = 2 ID 3, C1 = 3 ... 대한

내 총 컬럼 것이다 :

SELECT id, SUM(num) as total 
FROM (
    SELECT id, c, COUNT(1) as num 
    FROM data 
    GROUP BY id, c 
) x 
GROUP BY id; 

이 시나리오에서는 데이터를 피벗하지 않아도됩니다.

관련 문제