通过将行旋转到动态列数来在MySQL中创建摘要视图
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了通过将行旋转到动态列数来在MySQL中创建摘要视图,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2519字,纯文字阅读大概需要4分钟。
内容图文
![通过将行旋转到动态列数来在MySQL中创建摘要视图](/upload/InfoBanner/zyjiaocheng/902/93a818a9eb64461497a383824e775238.jpg)
我在MySQL中有一个表,其中包含以下字段:
id, company_name, year, state
同一客户和年份有多行,以下是数据示例:
id | company_name | year | state
----------------------------------------
1 | companyA | 2008 | 1
2 | companyB | 2009 | 2
3 | companyC | 2010 | 3
4 | companyB | 2009 | 1
5 | companyC | NULL | 3
我正在尝试从此表创建一个视图,以显示每行一个公司(即GROUP BY pubco_name),其中状态是给定年份的最高值.
以下是我要创建的视图的示例:
id | cuompany_name | NULL | 2008 | 2009 | 2010
--------------------------------------------------
1 | companyA | NULL | 1 | NULL | NULL
2 | companyB | NULL | 2 | NULL | NULL
3 | companyC | 3 | NULL | NULL | 3
有比这更多的数据,但你可以看到我想要实现的目标.
我不知道如何通过pubco_name为每年和组选择最大状态.
这是我到目前为止的SQL(我认为我们需要在这里使用CASE和/或子选择):
SELECT
id,
company_name,
SUM(CASE WHEN year = 2008 THEN max(state) ELSE 0 END) AS 2008,
SUM(CASE WHEN year = 2009 THEN max(state) ELSE 0 END) AS 2009,
SUM(CASE WHEN year = 2010 THEN max(state) ELSE 0 END) AS 2010,
SUM(CASE WHEN year = 2011 THEN max(state) ELSE 0 END) AS 2011,
SUM(CASE WHEN year = 2012 THEN max(state) ELSE 0 END) AS 2012,
SUM(CASE WHEN year = 2013 THEN max(state) ELSE 0 END) AS 2013
FROM tbl
GROUP BY company_name
ORDER BY id DESC
感谢您的帮助,并提前致谢.
解决方法:
你需要转动表,但mysql没有任何这样的pivot功能
所以我们需要复制它的功能
EDITED
Select
group_concat(
DISTINCT
if(year is null,
CONCAT('max(if (year is null, state, 0)) as ''NULL'' '),
CONCAT('max(if (year=''', year, ''', state, 0)) as ''',year, ''' '))
) into @sql from tbl join (SELECT @sql:='')a;
set @sql = concat('select company_name, ', @sql, 'from tbl group by company_name;');
PREPARE stmt FROM @sql;
EXECUTE stmt;
结果
| COMPANY_NAME | 2008 | 2009 | 2010 | NULL |
--------------------------------------------
| companyA | 1 | 0 | 0 | 0 |
| companyB | 0 | 2 | 0 | 0 |
| companyC | 0 | 0 | 3 | 3 |
有两种方法可以解决您的问题
1.为每年创建案例,这在我们处理年份时是不可能的
2.动态生成查询,以便根据您的需要获得正确的列.
我根据第二个解决方案给出了解决方案,我将生成查询并将其存储在@sql变量中.在小提琴中,我在执行它之前打印了@sql的内容.
select company_name, max(if (year='2008', state, 0)) as '2008' ,max(if (year='2009', state, 0)) as '2009' ,max(if (year='2010', state, 0)) as '2010' ,max(if (year is null, state, 0)) as 'NULL' from tbl group by company_name;
有关group_concat()的更多信息,请浏览链接
GROUP_CONCAT和
USER DEFINED VARIABLE
希望这可以帮助..
内容总结
以上是互联网集市为您收集整理的通过将行旋转到动态列数来在MySQL中创建摘要视图全部内容,希望文章能够帮你解决通过将行旋转到动态列数来在MySQL中创建摘要视图所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。