SQL 行转列 详细分析

来源:互联网 发布:滚齿机挂轮计算软件 编辑:程序博客网 时间:2024/06/06 07:24
 

表结构如下:
登录名 权限  权限id  用户名

admin 系统首页 1 孟灵

admin 采购进货 2 孟灵

admin 销售出货 3 孟灵

admin 查看库存 4 孟灵

admin 客户管理 5 孟灵
qy 系统首页 1 钱宇
qy 查看库存 4 钱宇

qy 供货商管理 6 钱宇


行专列语句:
select 登录名,用户名
max(case when  权限='采购进货'      then 1 else 0 end) 采购进货,

max(case when  权限='销售出货'      then 1 else 0 end) 销售出货,

max(case when  权限='查看库存'      then 1 else 0 end) 查看库存,

max(case when  权限='客户管理'      then 1 else 0 end) 客户管理,
max(case when  权限='供货商管理'    then 1 else 0 end) 供货商管理,

max(case when  权限='销售统计'      then 1 else 0 end) 销售统计,
max(case when  权限='退换货管理'    then 1 else 0 end) 退换货管理,
max(case when  权限='商品分类管理'  then 1 else 0 end) 商品分类管理,

max(case when  权限='员工管理'      then 1 else 0 end) 员工管理
from v_qux group by 登录名,用户名

 

转完之后:
admin 孟灵 1 1 1 1 0 0 0 0 0

qy 钱宇 0 0 1 0 1 0 0 0 0

case when  (列明)='值'   then 1 else 0 end 的意思: 差不多和if语句差不多, 如果列明等于值 就返回真 就执行 then 后面的, 如果列明不等于值 就返回假 就执行 else 后面的  在至于end 就是格式问题

 

重点:切忌 这是按行来比较的
首先如表:查询出第一行(admin 系统首页 1 孟灵)然后拿出第一行权限的那列(系统首页)和   max(case when  权限='采购进货'      then 1 else 0 end)采购进货,
           
max(case when  权限='销售出货'      then 1 else 0 end) 销售出货,

           max(case when  权限='查看库存'      then 1 else 0 end)查看库存,

           max(case when  权限='客户管理'      then 1 else 0 end) 客户管理,
           max(case when  权限='供货商管理'    then 1 else 0 end)供货商管理,

           max(case when  权限='销售统计'      then 1 else 0 end) 销售统计,           max(case when  权限='退换货管理'    then 1 else 0 end) 退换货管理,           max(case when  权限='商品分类管理'  then 1 else 0 end) 商品分类管理,

           max(case when  权限='员工管理'      then 1 else 0 end) 员工管理
这些按个比较(比较什么:比较第一行(也就是上面如表所示的权限那列)) 咱们把所有的有可能的都列出来, 如果有符合的就让他下面的那列值是“1” 如果没有符合的就让他下面那列值是“0”,比较晚之后  在比较 第二列以此类推

原创粉丝点击