zoukankan      html  css  js  c++  java
  • SQL交叉表

    之前做货品横向展示时,有看到评论说用到交叉表。

    公司最近需要给订单表做一个数据汇总的功能,同事给到一个参考SQL

    select * from (select COUNT(1) as 已锁定 from tbl_order where orderLock = 1) as A,
    (select COUNT(1) as 未锁定 from tbl_order where orderLock = 0) as B,
    (select COUNT(1) as 未发货 from tbl_order where PushStatus=1 and statusid=14) as C,
    (select COUNT(1) as 待发货 from tbl_order where PushStatus=1 and statusid=14 and isshipments=1) as D,
    (select COUNT(1) as 已发货 from tbl_order where statusid=4) as E,
    (select COUNT(1) as 未分配 from tbl_order where statusid = 14 and PushStatus<>3 and pushstatus=0) as F,
    (select COUNT(1) as 已分配 from tbl_order where PushStatus=1) as G,
    (select COUNT(1) as 已推送 from tbl_order where PushStatus=2) as H

    看完改为下面SQL

    SELECT
    COUNT(CASE WHEN orderLock=1 THEN 1 ELSE NULL END) AS '已锁定',
    COUNT(CASE WHEN orderLock=0 THEN 1 ELSE NULL END) AS '未锁定',
    COUNT(CASE WHEN PushStatus=1 and statusid=14 THEN 1 ELSE NULL END) AS '未发货',
    COUNT(CASE WHEN PushStatus=1 and statusid=14 and isshipments=1 THEN 1 ELSE NULL END) AS '待发货',
    COUNT(CASE WHEN statusid=4 THEN 1 ELSE NULL END) AS '已发货',
    COUNT(CASE WHEN statusid = 14 and PushStatus<>3 and pushstatus=0 THEN 1 ELSE NULL END) AS '未分配',
    COUNT(CASE WHEN PushStatus=1 THEN 1 ELSE NULL END) AS '已分配',
    COUNT(CASE WHEN PushStatus=2 THEN 1 ELSE NULL END) AS '已推送'
    FROM tbl_order

    与上面参考SQL相比只用到了一次查询表,并且如果有where条件更利于扩展。

    直接上图 SQL执行计划参考:

     

     这个差距显而易见,欢迎大家提出更加优化的SQL。 

  • 相关阅读:
    BZOJ3670:[NOI2014]动物园(KMP)
    415. [HAOI2009] 旅行
    U10223 Cx大帝远征埃及
    U10206 Cx的治疗
    2741. [济南集训 2017] 掰巧克力
    复习题目汇总 over
    7-20 表达式转换(25 分)
    7-19 求链式线性表的倒数第K项(20 分)(单链表定义与尾插法)
    7-18 银行业务队列简单模拟(25 分)
    7-17 汉诺塔的非递归实现(25 分)(有待改进)
  • 原文地址:https://www.cnblogs.com/Tangcy/p/5610069.html
Copyright © 2011-2022 走看看