2010-01-22 108 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 2010-01-22 06:09:52

+1

是不是有一個原因,你不簡單地把表格變成一些理智的形式? @Sejanus:沒有。檢查他的例子。 – 2010-01-22 06:12:36

+2

基於標準的跆拳道/分鐘的規模,這繪製了一個堅實的15. – Jason 2010-01-22 06:16:05

回答

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;