这种类型的转换称为枢轴。您没有指定您正在使用的数据库,因此我将为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 – 我需要知道如何创建交叉表查询相关推荐

  1. mysql数据库访问300ms以上_[Java教程]一张900w的数据表,16s执行的SQL优化到300ms?...

    [Java教程]一张900w的数据表,16s执行的SQL优化到300ms? 0 2020-11-20 16:00:16 一,前言 证实 有一张财务流水表,未分库分表,目前的数据量为9555695,分页 ...

  2. mysql的建库建表语句_SQL语句(建库、建表、修改语句)

    1 create databasesql_test2 go 3 --打开数据库 sql_test 4 usesql_test5 go 6 7 --建立学生表 8 create table学生9 (学生 ...

  3. MySQL数据库-笔记03【范式(1NF、2NF、3NF)、查询练习题*10道(附解析)】

    学习地址:一天学会 MySQL 数据库      MySQL安装教程      MySQL专栏

  4. sql server表分区_SQL Server 2016增强功能– SQL截断表和表分区

    sql server表分区 The idea behind this article is to discuss the importance and the implication of SQL P ...

  5. mysql数据库中发布与订阅_SQL Server 2012 使用订阅发布同步数据库

    如何让数据既统一又独立?其实SQLServer已经为我们提供了很好的解决方案:发布.订阅.打开SQL Server2012的对象资源管理器我们可 软件做大了,客户就多了,一个数据库服务器是远远不够的, ...

  6. 如何快速创建腾讯云MySQL数据库并远程连接?

    创建 MySQL 实例 操作步骤 登录 MySQL 购买页,根据实际需求选择各项配置信息,确认无误后,单击立即购买. 计费模式:支持包年包月和按量计费. 若业务量有较稳定的长期需求,建议选择包年包月. ...

  7. 1亿条数据如何分表100张到Mysql数据库中(PHP)

    来源:http://www.jb51.net/article/70265.htm 这篇文章主要介绍了当数据量猛增的时候如何把一亿条数据分表100张到Mysql数据库中,需要的朋友可以参考下 下面通过创 ...

  8. Mysql数据库drop表不用跑路,表空间传输助你恢复数据

    今天给大家介绍一种,在Mysql数据库中,利用InnoDb的表空间传输功能,帮助你恢复drop的业务表. Mysql表空间传输限制 要使用Mysql数据库表空间传输功能,有2个限制 1.Mysql数据 ...

  9. mysql数据库用户的创建、修改、删除

    1.1 登录MySQL服务器 启动MySQL服务后,可以通过mysql命令来登录MySQL服务器,命令如下: mysql –h hostname|hostIP –P port –u username ...

最新文章

  1. JSOI2012-夏令营 Mar Maps
  2. sqlplus登录时遇到的ORA-12560: TNS: 协议适配器错误解决办法
  3. JAVA的内省机制(introspector)与反射机制(reflection)
  4. java与c++中的对象序列化分析
  5. 河神,不用砍死那个天秤座的男孩了
  6. 25-70K*14薪| 梅卡曼德视觉算法、C++软件开发工程师等职位招聘
  7. java控制台输入输出
  8. 【MATLAB深度学习工具箱】学习笔记--字符识别Character Recognition
  9. 20200427 FTL 模板语言参考 梳理 (常用)
  10. matlab 工具箱 comsol 联,基于MATLAB与COMSOL联合仿真的电磁优化设计
  11. 不能创建对象qmdispatch_关于系统弹出错误:429 , ActiveX 部件不能创建对象 的解决方法...
  12. 【微服务集成阿里SMS短信服务发送短信】
  13. 2020-03-10
  14. python模拟登录URP教务系统评教
  15. 驱动专题:第四章MTD及Flash驱动 3. nandflash 详细硬件特性
  16. 梦雨百度网盘批量改名与文件批量复制
  17. Alfresco 部署 企业文档管理系统
  18. 英文网站的优化怎么判断是否到位
  19. RISC-V调用惯例
  20. 【分享】5S管理专员测试试题

热门文章

  1. 非线性优化库Ceres问题记录
  2. Please review your Gradle project setup in the android/ folde
  3. altium designer快捷键大全
  4. java-TreeSet进行排序的2种方式
  5. lisp 设计盘形齿轮铣刀_齿轮是怎么来的——图解6种齿轮加工工艺
  6. Linux中的Java类,Java基础入门学习-Java中类的属性
  7. Maven Oracle JDBC
  8. QT学习-10/31/2012
  9. spring batch 读mysql_spring batch csv文件导入到mysql数据库
  10. php properties,PHP ReflectionClass getStaticProperties()用法及代码示例