mysql数据库创建交叉表查询_sql – 我需要知道如何创建交叉表查询
这种类型的转换称为枢轴。您没有指定您正在使用的数据库,因此我将为SQL Server和MySQL提供答案。
SQL Server:如果您使用的是SQL Server 2005,则可以实现PIVOT功能。
如果您要将已知数量的值转换为列,则可以对查询进行硬编码。
select typename, total, Deployed, Inventory, shipped
from
(
select count(*) over(partition by t.typename) total,
s.statusname,
t.typename
from assets a
inner join assettypes t
on a.assettype = t.id
inner join assetstatus s
on a.assetstatus = s.id
) d
pivot
(
count(statusname)
for statusname in (Deployed, Inventory, shipped)
) piv;
但是,如果您具有未知数量的状态值,则需要使用动态sql在运行时生成列列表。
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(statusname)
from assetstatus
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT typename, total,' + @cols + ' from
(
select count(*) over(partition by t.typename) total,
s.statusname,
t.typename
from assets a
inner join assettypes t
on a.assettype = t.id
inner join assetstatus s
on a.assetstatus = s.id
) x
pivot
(
count(statusname)
for statusname in (' + @cols + ')
) p '
execute(@query)
这也可以使用带有case表达式的聚合函数编写:
select typename,
total,
sum(case when statusname ='Deployed' then 1 else 0 end) Deployed,
sum(case when statusname ='Inventory' then 1 else 0 end) Inventory,
sum(case when statusname ='Shipped' then 1 else 0 end) Shipped
from
(
select count(*) over(partition by t.typename) total,
s.statusname,
t.typename
from assets a
inner join assettypes t
on a.assettype = t.id
inner join assetstatus s
on a.assetstatus = s.id
) d
group by typename, total
MySQL:这个数据库没有pivot函数,所以你必须使用aggregate函数和CASE表达式。它也没有窗口函数,因此您必须稍微更改查询到以下内容:
select typename,
total,
sum(case when statusname ='Deployed' then 1 else 0 end) Deployed,
sum(case when statusname ='Inventory' then 1 else 0 end) Inventory,
sum(case when statusname ='Shipped' then 1 else 0 end) Shipped
from
(
select t.typename,
(select count(*)
from assets a1
where a1.assettype = t.id
group by a1.assettype) total,
s.statusname
from assets a
inner join assettypes t
on a.assettype = t.id
inner join assetstatus s
on a.assetstatus = s.id
) d
group by typename, total;
然后,如果您需要MySQL中的动态解决方案,则必须使用预准备语句来生成要执行的sql字符串:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'sum(CASE WHEN statusname = ''',
statusname,
''' THEN 1 else 0 END) AS `',
statusname, '`'
)
) INTO @sql
FROM assetstatus;
SET @sql
= CONCAT('SELECT typename,
total, ', @sql, '
from
(
select t.typename,
(select count(*)
from assets a1
where a1.assettype = t.id
group by a1.assettype) total,
s.statusname
from assets a
inner join assettypes t
on a.assettype = t.id
inner join assetstatus s
on a.assetstatus = s.id
) d
group by typename, total');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
两个数据库中的所有查询的结果都相同:
| TYPENAME | TOTAL | DEPLOYED | INVENTORY | SHIPPED |
-----------------------------------------------------
| Desktop | 2 | 1 | 1 | 0 |
| Laptop | 1 | 0 | 0 | 1 |
| Server | 1 | 1 | 0 | 0 |
mysql数据库创建交叉表查询_sql – 我需要知道如何创建交叉表查询相关推荐
- mysql数据库访问300ms以上_[Java教程]一张900w的数据表,16s执行的SQL优化到300ms?...
[Java教程]一张900w的数据表,16s执行的SQL优化到300ms? 0 2020-11-20 16:00:16 一,前言 证实 有一张财务流水表,未分库分表,目前的数据量为9555695,分页 ...
- mysql的建库建表语句_SQL语句(建库、建表、修改语句)
1 create databasesql_test2 go 3 --打开数据库 sql_test 4 usesql_test5 go 6 7 --建立学生表 8 create table学生9 (学生 ...
- MySQL数据库-笔记03【范式(1NF、2NF、3NF)、查询练习题*10道(附解析)】
学习地址:一天学会 MySQL 数据库 MySQL安装教程 MySQL专栏
- sql server表分区_SQL Server 2016增强功能– SQL截断表和表分区
sql server表分区 The idea behind this article is to discuss the importance and the implication of SQL P ...
- mysql数据库中发布与订阅_SQL Server 2012 使用订阅发布同步数据库
如何让数据既统一又独立?其实SQLServer已经为我们提供了很好的解决方案:发布.订阅.打开SQL Server2012的对象资源管理器我们可 软件做大了,客户就多了,一个数据库服务器是远远不够的, ...
- 如何快速创建腾讯云MySQL数据库并远程连接?
创建 MySQL 实例 操作步骤 登录 MySQL 购买页,根据实际需求选择各项配置信息,确认无误后,单击立即购买. 计费模式:支持包年包月和按量计费. 若业务量有较稳定的长期需求,建议选择包年包月. ...
- 1亿条数据如何分表100张到Mysql数据库中(PHP)
来源:http://www.jb51.net/article/70265.htm 这篇文章主要介绍了当数据量猛增的时候如何把一亿条数据分表100张到Mysql数据库中,需要的朋友可以参考下 下面通过创 ...
- Mysql数据库drop表不用跑路,表空间传输助你恢复数据
今天给大家介绍一种,在Mysql数据库中,利用InnoDb的表空间传输功能,帮助你恢复drop的业务表. Mysql表空间传输限制 要使用Mysql数据库表空间传输功能,有2个限制 1.Mysql数据 ...
- mysql数据库用户的创建、修改、删除
1.1 登录MySQL服务器 启动MySQL服务后,可以通过mysql命令来登录MySQL服务器,命令如下: mysql –h hostname|hostIP –P port –u username ...
最新文章
- JSOI2012-夏令营 Mar Maps
- sqlplus登录时遇到的ORA-12560: TNS: 协议适配器错误解决办法
- JAVA的内省机制(introspector)与反射机制(reflection)
- java与c++中的对象序列化分析
- 河神,不用砍死那个天秤座的男孩了
- 25-70K*14薪| 梅卡曼德视觉算法、C++软件开发工程师等职位招聘
- java控制台输入输出
- 【MATLAB深度学习工具箱】学习笔记--字符识别Character Recognition
- 20200427 FTL 模板语言参考 梳理 (常用)
- matlab 工具箱 comsol 联,基于MATLAB与COMSOL联合仿真的电磁优化设计
- 不能创建对象qmdispatch_关于系统弹出错误:429 , ActiveX 部件不能创建对象 的解决方法...
- 【微服务集成阿里SMS短信服务发送短信】
- 2020-03-10
- python模拟登录URP教务系统评教
- 驱动专题:第四章MTD及Flash驱动 3. nandflash 详细硬件特性
- 梦雨百度网盘批量改名与文件批量复制
- Alfresco 部署 企业文档管理系统
- 英文网站的优化怎么判断是否到位
- RISC-V调用惯例
- 【分享】5S管理专员测试试题
热门文章
- 非线性优化库Ceres问题记录
- Please review your Gradle project setup in the android/ folde
- altium designer快捷键大全
- java-TreeSet进行排序的2种方式
- lisp 设计盘形齿轮铣刀_齿轮是怎么来的——图解6种齿轮加工工艺
- Linux中的Java类,Java基础入门学习-Java中类的属性
- Maven Oracle JDBC
- QT学习-10/31/2012
- spring batch 读mysql_spring batch csv文件导入到mysql数据库
- php properties,PHP ReflectionClass getStaticProperties()用法及代码示例