18
2019
04

oracle中with语句提高查询效率

需求:SUM统计总数之后再列转行。

查询结果:


原始版本SQL:

select nvl(sum(OVERTIME_REPAIR ),0) CNT,
 '维修超时' CELL from (
 SELECT SUM(CASE
             WHEN ROUND((A.DELIVERY_DATE - A.PRE_GET_DATE) * 24 * 60) > 0 THEN
              1
             ELSE
              0
           END) AS OVERTIME_DELIVERY, /*交车超时*/
       SUM(CASE
             WHEN ROUND((A.DELIVERY_DATE - A.PRE_GET_DATE) * 24 * 60) <= 0 THEN
              1
             ELSE
              0
           END) AS NORMAL_DELIVERY, /*正常交车*/
       SUM(CASE
             WHEN (ROUND((W.CLEAN_FINISH_DATE - W.QUALITY_FINISH_DATE) * 24 * 60) > 20) THEN
              1
             ELSE
              0
           END) OVERTIME_CLEAN, /*洗车超时*/
       SUM(CASE
             WHEN (ROUND((W.QUALITY_FINISH_DATE - A.PRE_GET_DATE) * 24 * 60) > 0) THEN
              1
             ELSE
              0
           END) OVERTIME_CHECK, /*质检超时*/
       SUM(CASE
             WHEN ROUND((W.REPAIR_FINISH_DATE -
                        (SELECT MAX(PLAN_END_DATE)
                            FROM T_TEMP_MY_BU_WORK_ORDER_D WI
                           WHERE WI.REPAIR_ORDER_ID = A.REPAIR_ORDER_ID)) * 24 * 60) > 0 THEN
              1
             ELSE
              0
           END) OVERTIME_REPAIR /*维修超时*/
  FROM T_TEMP_MY_BU_REPAIR_ORDER A
  LEFT JOIN T_TEMP_MY_BU_WORK_ORDER W ON W.REPAIR_ORDER_ID = A.REPAIR_ORDER_ID
  JOIN T_TEMP_MY_ORG_DLR DLR ON DLR.DLR_ID = A.DLR_ID
 WHERE A.IS_ENABLE = '1'
   AND A.BILL_TYPE = '31803'
   AND A.REPAIR_ORDER_STATUS = '31011'
 )
 UNION ALL
select nvl(sum(OVERTIME_CLEAN),0) CNT,
'洗车超时' SELL
from (
 SELECT SUM(CASE
             WHEN ROUND((A.DELIVERY_DATE - A.PRE_GET_DATE) * 24 * 60) > 0 THEN
              1
             ELSE
              0
           END) AS OVERTIME_DELIVERY, /*交车超时*/
       SUM(CASE
             WHEN ROUND((A.DELIVERY_DATE - A.PRE_GET_DATE) * 24 * 60) <= 0 THEN
              1
             ELSE
              0
           END) AS NORMAL_DELIVERY, /*正常交车*/
       SUM(CASE
             WHEN (ROUND((W.CLEAN_FINISH_DATE - W.QUALITY_FINISH_DATE) * 24 * 60) > 20) THEN
              1
             ELSE
              0
           END) OVERTIME_CLEAN, /*洗车超时*/
       SUM(CASE
             WHEN (ROUND((W.QUALITY_FINISH_DATE - A.PRE_GET_DATE) * 24 * 60) > 0) THEN
              1
             ELSE
              0
           END) OVERTIME_CHECK, /*质检超时*/
       SUM(CASE
             WHEN ROUND((W.REPAIR_FINISH_DATE -
                        (SELECT MAX(PLAN_END_DATE)
                            FROM T_TEMP_MY_BU_WORK_ORDER_D WI
                           WHERE WI.REPAIR_ORDER_ID = A.REPAIR_ORDER_ID)) * 24 * 60) > 0 THEN
              1
             ELSE
              0
           END) OVERTIME_REPAIR /*维修超时*/
  FROM T_TEMP_MY_BU_REPAIR_ORDER A
  LEFT JOIN T_TEMP_MY_BU_WORK_ORDER W ON W.REPAIR_ORDER_ID = A.REPAIR_ORDER_ID
  JOIN T_TEMP_MY_ORG_DLR DLR ON DLR.DLR_ID = A.DLR_ID
 WHERE A.IS_ENABLE = '1'
   AND A.BILL_TYPE = '31803'
   AND A.REPAIR_ORDER_STATUS = '31011'
 )
 UNION ALL
select nvl(sum(OVERTIME_CHECK),0) CNT,
'质检超时' SELL
from (
 SELECT SUM(CASE
             WHEN ROUND((A.DELIVERY_DATE - A.PRE_GET_DATE) * 24 * 60) > 0 THEN
              1
             ELSE
              0
           END) AS OVERTIME_DELIVERY, /*交车超时*/
       SUM(CASE
             WHEN ROUND((A.DELIVERY_DATE - A.PRE_GET_DATE) * 24 * 60) <= 0 THEN
              1
             ELSE
              0
           END) AS NORMAL_DELIVERY, /*正常交车*/
       SUM(CASE
             WHEN (ROUND((W.CLEAN_FINISH_DATE - W.QUALITY_FINISH_DATE) * 24 * 60) > 20) THEN
              1
             ELSE
              0
           END) OVERTIME_CLEAN, /*洗车超时*/
       SUM(CASE
             WHEN (ROUND((W.QUALITY_FINISH_DATE - A.PRE_GET_DATE) * 24 * 60) > 0) THEN
              1
             ELSE
              0
           END) OVERTIME_CHECK, /*质检超时*/
       SUM(CASE
             WHEN ROUND((W.REPAIR_FINISH_DATE -
                        (SELECT MAX(PLAN_END_DATE)
                            FROM T_TEMP_MY_BU_WORK_ORDER_D WI
                           WHERE WI.REPAIR_ORDER_ID = A.REPAIR_ORDER_ID)) * 24 * 60) > 0 THEN
              1
             ELSE
              0
           END) OVERTIME_REPAIR /*维修超时*/
  FROM T_TEMP_MY_BU_REPAIR_ORDER A
  LEFT JOIN T_TEMP_MY_BU_WORK_ORDER W ON W.REPAIR_ORDER_ID = A.REPAIR_ORDER_ID
  JOIN T_TEMP_MY_ORG_DLR DLR ON DLR.DLR_ID = A.DLR_ID
 WHERE A.IS_ENABLE = '1'
   AND A.BILL_TYPE = '31803'
   AND A.REPAIR_ORDER_STATUS = '31011'
 )


11
2019
04

oracle中join右表最多只取一条指定的数据

一般情况下,如果类型这种:

       select * from A
       left join B 
       ON A.con_id=B.con_id;

假设A中有1条数据,B中与A关联的数据有2条或以上,查出的结果是有2条或以上,有些情况我们需要以A表为准,B表只查想要的一条记录

06
2019
01

oracle11g安装配置

之前有安装oracle11g,但都是装好了不会用,今天试了下能安装成功、配置好、然后可以用客户端连接使用,这里肯定要查很多的相关资料,不然也弄不好。

下面简单记录一步骤:

1、下载

下载文件一共有两部分:

https://download.oracle.com/otn/nt/oracle11g/112010/win64_11gR2_database_1of2.zip

04
2019
01

oracle-存储过程生成Java的entity类代码

查询Oracle表的字段SQL如下:

select 

        ut.TABLE_NAME,--表名称

        ut.COLUMN_NAME,--字段名称

        uc.comments,--字段注释

        ut.DATA_TYPE,--字典类型

15
2018
04

mysql5.7简单安装配置教程

环境:windows server 2012 R2 (64位系统)

安装mysql说来简单,但安装后要配置用户和权限,有那么一点点流程和语法记录一下。


https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.21-winx64.zip

13
2017
09

sql server经常使用的树形结构表递归查询语句

应用场景:一般是菜单、组织层级、上下级权限等功能使用,数据库结构就是有id和pid(上级ID)

虽然说用循环语句也能解决,但逻辑还是不够简洁,下面贴上SQL代码:


WITH    cte
                      AS ( SELECT   OrgId ,
                                    ParentId ,
                                    IsArea ,
                                    IsActive ,
                                    sort ,
                                    CAST( OrgId AS NVARCHAR(MAX)) path,
1 AS OrgLevel
                           FROM     dbo.SysOrg
                           WHERE    ParentId = 0
                           UNION ALL
                           SELECT   o.OrgId ,
                                    o.ParentId ,
                                    o.IsArea ,
                                    o.IsActive ,
                                    o.sort ,
                                    c.path + '\' + CAST( o.OrgId AS NVARCHAR(MAX)) path,-- 递归,路径为父路径+当前路径
c.OrgLevel+1 AS OrgLevel -- 递归,层数为父级层数+1
                           FROM     SysOrg o
                                    JOIN cte c ON o.ParentId = c.OrgId
                         )
 SELECT * FROM cte;


03
2017
09

sql使用临时表和游标更新酒景orgid(mssql)

sql:

-- 临时表
select * into #sysorgtemp from SysOrg(nolock);
select * into #producttemp from (
select ProductId,BdId,p.OrgId productOrgId,u.OrgId userOrgId
from Product(nolock) p
left join SysUser u on p.BdId = u.LoginId
where p.OrgId is null and p.BdId is not null
) temp
where temp.userOrgId is not NULL;
-- 这里,可以加sql把要更新的数据,备份到一张备份表


07
2016
06

MySql生成.Net中Model类的存储过程

最近用MySQL,花时间写了一个过程用来生成EF的model类,有注释,挺方便,用EF类Entity自动生成的没有字段注释。

25
2016
01

数据库设计之数据库tinyint字段与Int字段的使用

SQL SERVER中的tinyint从 0 到 255 的整型数据。存储大小为 1 字节。

12
2014
05

mssql数据库游标批量修改符合条件的记录

//需求:由于项目刚上传,没有票数,为了表现出一定的人气,需要在一开始把各项目的票数赋一个值 ,

但每个项目不能一样,否则容易看出问题,呵呵 。