mysql - 子查询

标签 mysql sql unpivot

我有这张 table

enter image description here

我想要并且可以让它看起来像这样

enter image description here

我使用的查询是这样的 {

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/

相关文章:

mysql - 从以某些字符为界的 MySQL 列中提取多个文本实例

mysql - 查询最后促销日期的SQL语句

sql - 转置行和列而不进行聚合

sql - TSQL - UNPIVOT 帮助

具有动态生成列、聚合函数和无聚合列的 SQL Pivot

mysql - PDO 交易?

sql - MySQL-如何在邮政编码前面加上“0”?

mysql - 从每 5 行中选择最高价格

mysql - SQL SERVER 2012 如果存在和如果不存在

PHP – 无法让左连接表进行回显