2016-11-07 6 views
0

I've искал много, но я не могу понять, как это сделать, если это возможно ... подмигнулиИспользование переменных вместо имена полей В MySQL выберите запрос

У меня есть эта таблица:

CREATE TABLE bilanci (
    id    int AUTO_INCREMENT NOT NULL, 
    medicoid  int NOT NULL, 
    `1`    int NOT NULL DEFAULT 0, 
    `2`    int NOT NULL DEFAULT 0, 
    `3`    int NOT NULL DEFAULT 0, 
    `4`    int NOT NULL DEFAULT 0, 
    `5`    int NOT NULL DEFAULT 0, 
    `6`    int NOT NULL DEFAULT 0, 
    `7`    int NOT NULL DEFAULT 0, 
    `8`    int NOT NULL DEFAULT 0, 
    `9`    int NOT NULL DEFAULT 0, 
    `10`   int NOT NULL DEFAULT 0, 
    `11`   int NOT NULL DEFAULT 0, 
    `12`   int NOT NULL DEFAULT 0, 
    conguagliodic decimal(10,2), 
    totbilancianno int DEFAULT 0, 
    totpagato  decimal(12,2), 
    totdapagare  decimal(12,2), 
    conguaglio  decimal(10,2), 
    rifanno   int NOT NULL, 
    pvimun   decimal(10,4) NOT NULL DEFAULT 9.4432, 
    PRIMARY KEY (id) 
) ENGINE = InnoDB; 

в fileds названного чисел соответствуют месяцам, и мне нужно, чтобы иметь выбор, как:

select medicoid, (month(curdate()) -2), totdapagare from bilanci 

Где (month(curdate()) -2) соответствует области, мне нужно выбрать.

Возможно ли это?

+0

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

ответ

0

Я хотел бы предложить вам нормализовать структуру базы данных, вы могли бы иметь одну таблицу, как это:

CREATE TABLE bilanci (
    id    int AUTO_INCREMENT NOT NULL, 
    medicoid  int NOT NULL, 
    conguagliodic decimal(10,2), 
    totbilancianno int DEFAULT 0, 
    totpagato  decimal(12,2), 
    totdapagare  decimal(12,2), 
    conguaglio  decimal(10,2), 
    pvimun   decimal(10,4) NOT NULL DEFAULT 9.4432, 
    PRIMARY KEY (id) 
) ENGINE = InnoDB; 

и второй таблицы bilanci_month:

create table bilanci_month (
    id int auto_increment, 
    bilanci_id int, 
    rifanno int NOT NULL, 
    month int NOT NULL, 
    value int) 

(bilanci_id может быть определен как иностранный ключ bilanci_month), тогда ваш запрос будет выглядеть так:

select 
    b.medicoid, 
    coalesce(bm.value, 0), 
    b.totdapagare from bilanci 
from 
    bilanci b left join bilanci_month bm 
    on b.id = bm.bilanci_id and bm.month = month(curdate())-2 

также, будьте осторожны в отношении month(curdate())-2, что произойдет, если месяц январь или февраль? Вы должны реализовать некоторую логику, чтобы получить, например, ноябрь или декабрь предыдущего года (и добавить эту логику к вашему соединению).

+0

спасибо за ваше решение и за советы! Я попробовал это, кажется, работает нормально: select if ((select month (curdate()) - 2) = 0,12, if ((select month (curdate) -2) = -1,11, (выберите месяц (curdate())))) в качестве месяца и выберите if ((выберите месяц (curdate()) - 2) <= 0, (выберите год (curdate()) -1), (выберите год (curdate()))) как год –