我有这张 table
我想要并且可以让它看起来像这样
我使用的查询是这样的 {
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
}
我可以通过 View 或存储过程或其他方式实现此目的吗? 我的 MySQL 版本是 5.5,它不能在 View 中包含子查询,而且我无法升级我的数据库,因为我无法承受任何损失或错误。
最佳答案
您不需要派生表(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
另一个解决方案基于对存储月份名称“Jan”到“Dec”的第二个表的CROSS JOIN
:
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
关于mysql - 子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49645190/