У меня есть эта таблица
И я хочу и могу заставить его выглядеть так
я использовал этот запрос {
SELECT Cat,Reg,Branch, Mnth, Qty
FROM
(
SELECT Cat,Reg,Branch, 'Jan' Mnth, Jan Qty
FROM BQV
WHERE Jan > 0
UNION ALL
SELECT Cat,Reg,Branch, 'Feb', Feb
FROM BQV
UNION ALL
SELECT Cat,Reg,Branch, 'Mar', Mar
FROM BQV
UNION ALL
SELECT Cat,Reg,Branch, 'Apr', Apr
FROM BQV
UNION ALL
SELECT Cat,Reg,Branch, 'May', May
FROM BQV
UNION ALL
SELECT Cat,Reg,Branch, 'Jun', Jun
FROM BQV
UNION ALL
SELECT Cat,Reg,Branch, 'Jul', Jul
FROM BQV
WHERE Feb > 0
UNION ALL
SELECT Cat,Reg,Branch, 'Aug', Aug
FROM BQV
UNION ALL
SELECT Cat,Reg,Branch, 'Sept', Sep
FROM BQV
UNION ALL
SELECT Cat,Reg,Branch, 'Oct', Octo
FROM BQV
UNION ALL
SELECT Cat,Reg,Branch, 'Nov', Nov
FROM BQV
UNION ALL
SELECT Cat,Reg,Branch, 'Dec', Dece
FROM BQV
) QV
}
Могу ли я достичь этого с помощью видов или хранимой процедуры или чего-нибудь еще? мой MySQL ver 5.5, и он не может иметь подзапросы в представлении, и я не могу обновить свою БД, поскольку я не могу позволить ЛЮБЫЕ потери или ошибки вообще.
Следующий VIEW делает то, что мне нужно.
CREATE VIEW scheme-test
. trybqv1
AS
SELECT Cat, Reg, Branch, 'Jan' Mnth, Jan Qty FROM BQV UNION ALL SELECT Cat, Reg, Branch, 'Feb', Feb FROM BQV
UNION ALL SELECT Cat, Reg, Branch, 'Mar', Mar FROM BQV
UNION ALL SELECT Cat, Reg, Branch, 'Apr', Apr FROM BQV
UNION ALL SELECT Cat, Reg, Branch, 'May', May FROM BQV
UNION ALL SELECT Cat, Reg, Branch, 'Jun', Jun FROM BQV
UNION ALL SELECT Cat, Reg, Branch, 'Jul', Jul FROM BQV
UNION ALL SELECT Cat, Reg, Branch, 'Aug', Aug FROM BQV
UNION ALL SELECT Cat, Reg, Branch, 'Sept', Sep FROM BQV
UNION ALL SELECT Cat, Reg, Branch, 'Oct', Octo FROM BQV
UNION ALL SELECT Cat, Reg, Branch, 'Nov', Nov FROM BQV
UNION ALL SELECT Cat, Reg, Branch, 'Dec', Dece FROM BQV
Вам не нужна производная таблица (которая называется Wondlgy подзапросом MySQL), просто удалите ее:
CREATE VIEW foo AS
SELECT Cat,Reg,Branch, 'Jan' AS Mnth, Jan AS Qty
FROM BQV
WHERE Jan > 0
UNION ALL
SELECT Cat,Reg,Branch, 'Feb', Feb
FROM BQV
UNION ALL
SELECT Cat,Reg,Branch, 'Mar', Mar
FROM BQV
UNION ALL
SELECT Cat,Reg,Branch, 'Apr', Apr
FROM BQV
UNION ALL
SELECT Cat,Reg,Branch, 'May', May
FROM BQV
UNION ALL
SELECT Cat,Reg,Branch, 'Jun', Jun
FROM BQV
UNION ALL
SELECT Cat,Reg,Branch, 'Jul', Jul
FROM BQV
WHERE Feb > 0
UNION ALL
SELECT Cat,Reg,Branch, 'Aug', Aug
FROM BQV
UNION ALL
SELECT Cat,Reg,Branch, 'Sept', Sep
FROM BQV
UNION ALL
SELECT Cat,Reg,Branch, 'Oct', Octo
FROM BQV
UNION ALL
SELECT Cat,Reg,Branch, 'Nov', Nov
FROM BQV
UNION ALL
SELECT Cat,Reg,Branch, 'Dec', Dece
FROM BQV
Другое решение основано на CROSS JOIN
на 2-й таблице, где хранятся имена месяцев от "Jan" до "Dec":
create table months ( mnth char(3));
insert into months values ('Jan'),('Feb'),...
select Cat,Reg,Branch, months.mnth,
case mnth
when 'Jan' then Jan
when 'Feb' then Feb
...
when 'Dec' then Dece
end
from BQV CROSS JOIN months