2012-05-24 2 views
0

Я пытаюсь создать абстракцию данных в SQL, где я могу выбрать квартал, на который я хочу посмотреть информацию о моем сотруднике. Сейчас я использую систему именования Q1_P1_N для «Quarter 1 Project 1 name», а Q1_P1_W - «вес проекта 1». Сотрудники могут работать над несколькими проектами. До сих пор, что у меня есть:пользовательская переменная в запросе MySQL

CREATE PROCEDURE effort_lookup4(IN proj_name VARCHAR(20), IN quarter INT(1)) 
BEGIN 
SET @Qx_P1_N = CONCAT('Q', quarter, '_P1_N'); 
SET @Qx_P2_N = CONCAT('Q', quarter, '_P2_N'); 
SET @Qx_P1_W = CONCAT('Q', quarter, '_P1_W'); 
SET @Qx_P2_W = CONCAT('Q', quarter, '_P2_W'); 
SET @var1 = (SELECT sum(@Qx_P1_W) FROM table_test WHERE @Qx_P1_N = proj_name); 
SET @var2 = (SELECT sum(@Qx_P2_W) FROM table_test WHERE @Qx_P2_N = proj_name); 

Моя проблема заключается в том, что всякий раз, когда я вызываю запрос с @ Qx_P1_N или @ Qx_P1_W Я на самом деле не передавая правильный запрос, и я не могу понять, что я я делаю неправильно. Это должно быть довольно просто. Я просто не привык к использованию SQL.

Вот пример того, что таблица выглядит, за исключением того, что оно осуществляет в Q2_P1_N и так далее через квартал:

+------+---------+---------+---------+---------+ 
| EMPID| Q1_P1_N | Q1_P2_N | Q1_P1_W | Q1_P2_W | 
+------+---------+---------+---------+---------+ 
| 1000 | ProjA | ProjB | 0.50 | 0.50 | 
| 1001 | ProjA | NULL | 1.00 | NULL | 
| 1010 | ProjB | NULL | 1.00 | NULL | 
| 1011 | ProjA | ProjB | 0.50 | 0.50 | 
+------+---------+---------+---------+---------+ 

Благодаря

+0

Не уверен, что я полностью следующий вопрос. Не могли бы вы отобразить данные образца из 'table_test'? – eggyal

+0

сделал изменения. – NateSHolland

ответ

0

Чтобы сделать то, что вы хотите с существующей структурой данных требует использования prepared statements (вы строите свой желаемый SELECT заявление в виде строки, которые вы затем PREPARE и EXECUTE).

Однако, вы, вероятно, будет проще изменить структуру данных:

 
+------+---------+---------+--------+ 
| EMPID| quarter | project | weight | 
+------+---------+---------+--------+ 
| 1000 |  1 | A  | 0.50 | 
| 1000 |  1 | B  | 0.50 | 
| 1001 |  1 | A  | 1.00 | 
| 1010 |  1 | B  | 1.00 | 
| 1011 |  1 | A  | 0.50 | 
| 1011 |  1 | B  | 0.50 | 
+------+---------+---------+--------+ 
+0

Спасибо, я понимаю, какую структуру данных вы предлагаете, единственная проблема заключается в том, что с что структура становится очень неэффективной, что является проблемой, потому что я пытаюсь в конечном итоге проиндексировать более 1000 сотрудников. – NateSHolland

+0

@NateSHolland: MySQL может легко справиться с этим - он вообще неэффективен. Просто убедитесь, что вы строите соответствующие индексы. – eggyal

+0

Итак, что происходит, когда я хочу посмотреть, на что работают сотрудники проекта 1000? – NateSHolland

0

На вашем операторе выбора у вас есть переменный в поле это должно быть имя столбца в таблице. Вам нужно будет переключить @ Qx_P1_W на Q1_P1_W.

+0

Но дело в том, что я хочу иметь возможность сделать столбец переменной, которую я могу изменить, поэтому я могу выбрать, в каком квартале я смотрю – NateSHolland

Смежные вопросы