рассчитать сумму на основе имени столбца

0

Можно ли связать одно значение с другим на основе имени столбца? Напр. в следующей ненормированной таблице, мне нужно рассмотреть значение из столбца state_amt_1 из другой таблицы, если state_cd_1 является "TX" и добавить это значение в state_amt_2, если state_cd_2 также является "TX".

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?
  • 1
    Есть ли причина, по которой вы не просто нормализуете таблицу в какой-то вменяемой форме? @Sejanus: Sejanus: Нет. Проверьте его пример.
Показать ещё 2 комментария
Теги:

1 ответ

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;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню