• mysql 的一点点记录


    以后再来整理。

    -- 查询一个学校的报修单数
    SELECT
      s.id AS schoolId , -- 学校ID
        COUNT(i.id) as cntId,  -- 报修单数
      IFNULL(t1.nohandlecnt,0) AS nohandlecnt,
       IFNULL(t2.overcnt,0) AS overcnt,
       ROUND(overcnt * 100 /COUNT(i.id),1)  AS okRate
    FROM
        `t_issue` i
    LEFT JOIN (
        -- 完成报修单数
        SELECT
            s.id AS schoolId , -- 学校ID
            IFNULL(COUNT(i.id),0) as overcnt  -- 完成的报修单数
        FROM
            `t_issue` i
        INNER JOIN t_school  s ON  i.school_id = s.id
        WHERE  i.completed_on IS NOT NULL  and
             i.acknowledged_on IS NOT NULL  
        GROUP BY 
        i.school_id     
    ) t2 ON t2.schoolId = i.school_id
    LEFT JOIN (
        -- 未处理数
        SELECT
            s.id AS schoolId , -- 学校ID
            IFNULL(COUNT(i.id),0) as nohandlecnt  -- 未处理报修单数
    
        FROM
            `t_issue` i
        INNER JOIN t_school  s ON  i.school_id = s.id
        WHERE 
     i.acknowledged_on IS  NULL  AND
     i.completed_on IS NULL  
    
        GROUP BY 
        i.school_id 
    ) t1 ON t1.schoolId = i.school_id
    INNER JOIN t_school  s ON  i.school_id = s.id
    GROUP BY 
    i.school_id 

     另一种保留小数的方法。

    SELECT 
            TRUNCATE (avg(attitude), 1) AS attitude,
            TRUNCATE (avg(timeliness), 1) AS timeliness,
            TRUNCATE (avg(professionality), 1) AS professionality,
            TRUNCATE (avg(overall), 1) AS overall
        FROM (
            SELECT 
                 school_id,s.sc_name,
                 TRUNCATE (avg(attitude),1) as attitude  ,
                 TRUNCATE (avg(timeliness), 1) as timeliness,
                 TRUNCATE (avg(professionality), 1) as professionality,
                 TRUNCATE (avg(overall), 1) as overall
                 FROM (
                SELECT 
                 t_repairmen.school_id ,
                TRUNCATE (avg(attitude),1) AS attitude,
                TRUNCATE (avg(timeliness),1) AS timeliness,
                TRUNCATE (avg(professionality),1) AS professionality ,
                    TRUNCATE (
                            (
                                avg(attitude) + avg(timeliness) + avg(professionality)
                            ) / 3,
                            1
                        ) AS overall
                 FROM `t_issue_rating` 
                INNER JOIN t_repairmen ON t_repairmen.id = t_issue_rating.repairmen_id
                WHERE `is_dummy` = '0' GROUP BY
                        repairmen_id,t_repairmen.school_id  ) t 
                INNER JOIN t_school  s ON  t.school_id = s.id
                WHERE
                1 = 1 
                <if test="conditions.schools!=null">
                    AND school_id in (${conditions.schools})
                </if>
                GROUP BY school_id
                ORDER BY
                s.id DESC    
                ) y 

     当遇到count 和group by 在一起,统计出的结果不正确时。

        SELECT COUNT(DISTINCT id) FROM `xx` WHERE 1 = 1  group by id  

     两个表的count值相加

    select
    (select count(*) from bumen)+(select count(*) from mrs) as sum_count 

     查询用户所在的排名

    SELECT
        concat(
            (
                @dddd_row_num :=@dddd_row_num + 1
            ) +0, ''
        ) AS row_id
    FROM
        history,
        (SELECT @dddd_row_num := 0) AS foo
    WHERE
        1 = 1
    order by  mp_send_time DESC
    limit 10 offset 0

     各种统计count:

    可以在统计count 的时候,将不符合条件的数排除在外

        count(if( e.ext5 is NOT NULL ,true,null)) erijCount,

    SELECT
        c.classes_id AS examId,
        i.eng_item_name AS examSubject,
        c.classes_name AS examName,
        eng_apply_start AS registStart,
        eng_apply_end AS registEnd,
        classes_status AS examStatus,
        classes_fee AS examFee,
        (
            CASE
            WHEN i.ext2 IS NOT NULL THEN
                i.ext2
            ELSE
                0
            END
        ) AS examFee1,
        A.realityApplyCount * classes_fee AS shouldApplyFee,
        A.realityApplyFee,
        A.realityApplyCount
    FROM
        eng_classes c
    INNER JOIN eng_item i ON i.eng_id = c.eng_id
    LEFT JOIN exam_examinee ON c.classes_id = examinee_exam_id
    AND (
        examinee_exam_status != '4'
        OR ISNULL(examinee_exam_status)
    )
    AND examinee_apply_type = 'english'
    LEFT JOIN (
        SELECT
            classes_id AS Id,
            count(
    
                IF (
                    examinee_pay_status = "1",
                    TRUE,
                    NULL
                )
            ) * classes_fee AS realityApplyFee,
            count(DISTINCT examinee_id) realityApplyCount
        FROM
            eng_classes
        INNER JOIN exam_examinee ON classes_id = examinee_exam_id
        AND (
            examinee_exam_status != '4'
            OR ISNULL(examinee_exam_status)
        )
        AND examinee_apply_type = 'english'
        GROUP BY
            classes_id
    ) AS A ON classes_id = A.Id
    WHERE
        1 = 1
    GROUP BY
        classes_id

     还有这样一种,sum去叠加,中间加判断的。

    SELECT 
                pro_apply_id AS examId ,
                pro_apply_name AS examSubject,
                pro_apply_start AS registStart ,
                pro_apply_end AS registEnd ,
                pro_apply_fee AS examFee ,
                A.realityApplyCount * pro_apply_fee as shouldApplyFee,
                A.realityApplyFee,
                A.realityApplyCount
            FROM  pro_apply 
            LEFT JOIN exam_examinee ee ON pro_apply_id = ee.exam_item_id 
                AND examinee_apply_type = 'profession'
            LEFT JOIN (
                SELECT 
                    apply_id AS Id ,
                    SUM(if(examinee_pay_status = "1",item_fee,0)) AS realityApplyFee ,
                    count(DISTINCT examinee_id) realityApplyCount
                FROM
                    pro_item 
                INNER JOIN  exam_examinee ee ON item_id = examinee_exam_id
                                            AND (examinee_exam_status != '4' OR ISNULL(examinee_exam_status))
                                            AND examinee_apply_type = 'profession'
                 GROUP BY apply_id
            )  AS A ON  A.Id LIKE CONCAT('%' ,pro_apply_id, '%')
  • 相关阅读:
    python的继承、封装、多态 --面向对象的特征
    ab压测工具简介
    dotnet core Console事件处理机制
    屹立千年,只为你一个回眸
    Derivative of the Sigmoid function
    Merge Overlapping Intervals
    Array of products
    Longest Peak
    javascript事件的注册方式总结
    纯css实现圆柱体-超简单!
  • 原文地址:https://www.cnblogs.com/sunxun/p/8986804.html
Copyright © 2020-2023  润新知