2010-01-22 8 views
0

어쨌든 열 이름을 기준으로 한 값을 다른 값과 연결할 수 있습니까? 예 : 다음 정규화되지 않은 테이블에서 state_cd_1이 'TX'이면 다른 테이블의 state_amt_1 열의 값을 고려해야하며 state_cd_2가 'TX'일 경우 해당 값을 state_amt_2에 추가해야합니다.열 이름을 기준으로 합계를 계산하십시오.

create table states (state_id int not null auto_increment, state_cd_1 varchar(100), state_cd_2 varchar(100), state_cd_3 varchar(100), state_cd_4 varchar(100), state_cd_5 varchar(100), primary key (state_id)); 
insert into states values (NULL, 'TX', NULL, NULL, NULL , 'OR'); 
insert into states values (NULL, 'OR', 'UT', NULL, NULL , NULL); 
insert into states values (NULL, 'AZ', 'OR', 'UT', NULL , 'AZ'); 

create table amount (amt_id int not null auto_increment, state_amt_1 varchar(100), state_amt_2 varchar(100), state_amt_3 varchar(100), state_amt_4 varchar(100), state_amt_5 varchar(100), primary key (amt_id)); 
insert into amount values (NULL, '100', 900, NULL, NULL , '200'); 
insert into amount values (NULL, '250', '300', NULL, NULL , NULL); 
insert into amount values (NULL, '400', '290', '350', NULL , '450'); 

(11:34) mysql>select * from states; 
+----------+------------+------------+------------+------------+------------+ 
| state_id | state_cd_1 | state_cd_2 | state_cd_3 | state_cd_4 | state_cd_5 | 
+----------+------------+------------+------------+------------+------------+ 
|  1 | TX   | NULL  | NULL  | NULL  | OR   | 
|  2 | OR   | UT   | NULL  | NULL  | NULL  | 
|  3 | AZ   | OR   | UT   | NULL  | AZ   | 
+----------+------------+------------+------------+------------+------------+ 

(11:34) mysql>select * from amount; 
+--------+-------------+-------------+-------------+-------------+-------------+ 
| amt_id | state_amt_1 | state_amt_2 | state_amt_3 | state_amt_4 | state_amt_5 | 
+--------+-------------+-------------+-------------+-------------+-------------+ 
|  1 | 100   | 900   | NULL  | NULL  | 200   | 
|  2 | 250   | 300   | NULL  | NULL  | NULL  | 
|  3 | 400   | 290   | 350   | NULL  | 450   | 
+--------+-------------+-------------+-------------+-------------+-------------+ 

Expected result: 

TX 100 
OR 740 
UT 650 
AZ 850 

OR 

TX OR UT AZ 
100 740 650 850 

How to calculate: 

TX: 100 
OR: 200+250+290=740 
UT: 300+350=650 
AZ: 400+450=850 

참고 : 주 이름이 변경 될 수 있습니다.

+0

STATE_ID는 amt_id 일치해야합니다? – Sejanus

+1

테이블을 정상적인 형식으로 정규화하지 않은 이유가 있습니까? @Sean : 아니오. 그의 예를 확인하십시오. –

+2

기준 wtf/min 척도를 기준으로하면 15로 표시됩니다. – Jason

답변

2

그것은 추한하지만이 같은 조합으로 작업을 수행 할 수 있습니다

SELECT st, sum(amt) FROM (
(
SELECT s.state_cd_1 AS st, a.state_amt_1 AS amt 
FROM states AS s JOIN amount AS a ON s.state_id = a.amt_id 
WHERE s.state_cd_1 IS NOT NULL AND a.state_amt_1 IS NOT NULL 
) UNION ALL (
SELECT s.state_cd_2 AS st, a.state_amt_2 AS amt 
FROM states AS s JOIN amount AS a ON s.state_id = a.amt_id 
WHERE s.state_cd_2 IS NOT NULL AND a.state_amt_2 IS NOT NULL 
) UNION ALL (
SELECT s.state_cd_3 AS st, a.state_amt_3 AS amt 
FROM states AS s JOIN amount AS a ON s.state_id = a.amt_id 
WHERE s.state_cd_3 IS NOT NULL AND a.state_amt_3 IS NOT NULL 
) UNION ALL (
SELECT s.state_cd_4 AS st, a.state_amt_4 AS amt 
FROM states AS s JOIN amount AS a ON s.state_id = a.amt_id 
WHERE s.state_cd_4 IS NOT NULL AND a.state_amt_4 IS NOT NULL 
) UNION ALL (
SELECT s.state_cd_5 AS st, a.state_amt_5 AS amt 
FROM states AS s JOIN amount AS a ON s.state_id = a.amt_id 
WHERE s.state_cd_5 IS NOT NULL AND a.state_amt_5 IS NOT NULL 
)) AS joined GROUP BY st; 
관련 문제