zoukankan      html  css  js  c++  java
  • mysql中case的一个例子

    最近遇到一个问题:

    yearamountnum
    1991 1 1.1
    1991 2 1.2
    1991 3 1.3
    1992 1 2.1
    1992 2 2.2
    1992 3 3.3

    把上面表格的数据查询成:

    yearm1m2m3
    1991 1.1 1.2 1.3
    1992 2.1 2.2 2.3

    看到这样的需求,首先想到的是用case去统计以及 用group by来分组

    第一版sql代码:

    SELECT
        `year`,
        (CASE WHEN amount = 1 THEN num END) AS n1,
        (CASE WHEN amount = 2 THEN num END) AS n2,
        (CASE WHEN amount = 3 THEN num END) AS n3
    FROM
        test
    GROUP BY
        `year`

    查询出来的结果有点不如人意:

    yearn1n2n3
    1991 1.1    
    1992 2.1    

    这么说明了分组之后只显示到第一行数据,那么我们去掉分组看看:

            SELECT
                `year`,
                (CASE WHEN amount = 1 THEN num END) AS n1,
                (CASE WHEN amount = 2 THEN num END) AS n2,
                (CASE WHEN amount = 3 THEN num END) AS n3
            FROM
                test
    yearn1n2n3
    1991 1.1    
    1991   1.2  
    1991     1.3
    1992 2.1    
    1992   2.2  
    1992     2.3

    有点像我们想要的了,只是没有分组以及去掉空值

    而且我们可以看出,在分组的情况下m1,m2,m3的值都是一个最大值来的

    所以我们可以用一个子查询来查询上面的结果集中分组的最大值 最终版sql:

    SELECT
        `year`,
        MAX(n1) AS m1,
        MAX(n2) AS m2,
        MAX(n3) AS m3
    FROM
        (
            SELECT
                `year`,
                (CASE WHEN amount = 1 THEN num END) AS n1,
                (CASE WHEN amount = 2 THEN num END) AS n2,
                (CASE WHEN amount = 3 THEN num END) AS n3
            FROM
                test
        ) AS a
    GROUP BY
        `year`

    最终可以得到我们想要的结果:

    yearm1m2m3
    1991 1.1 1.2 1.3
    1992 2.1 2.2 2.3
    还在找我的道
  • 相关阅读:
    cogs 896. 圈奶牛
    bzoj 1670: [Usaco2006 Oct]Building the Moat护城河的挖掘
    bzoj 1007: [HNOI2008]水平可见直线
    bzoj 3673: 可持久化并查集 by zky
    bzoj 3545: [ONTAK2010]Peaks
    bzoj 1901: Zju2112 Dynamic Rankings
    动态 K th
    poj 2104 K-th Number
    bzoj 3657 斐波那契数列(fib.cpp/pas/c/in/out)
    青蛙的约会
  • 原文地址:https://www.cnblogs.com/TimLiuDream/p/9902191.html
Copyright © 2011-2022 走看看