Hive中2列多行转成多列1行

550 阅读3分钟

8.png

转换成:

9.png

方法1: sum(case when...)

select
    --case
    --when month = '01' THEN sum_qty
    --end as '01', --SqlParseException: Sql 1 Encountered "\'01\'" at line 4, column 12. Please check [end as '01',].
    sum( -- sum要写在外层
        case
            when month = '01' THEN sum_qty -- 不可写成sum(sum_qty),会报错org.apache.calcite.runtime.CalciteContextException: Sql 1: From line 3, column 14 to line 3, column 18: Expression 'month' is not being grouped
        end
    ) as `01`,  -- 要用``不可用''
    sum(
        case
            when month = '02' THEN sum_qty
        end
    ) as `02`,
    sum(
        case
            when month = '03' THEN sum_qty
        end
    ) as `03`,
    sum(
        case
            when month = '04' THEN sum_qty
        end
    ) as `04`,
    sum(
        case
            when month = '05' THEN sum_qty
        end
    ) as `05`
from
    (
        select
            date_format(order_day, 'MM') as month,
            sum(qty) as sum_qty
        from
            (
                select
                    11 as order_id,
                    '2022-01-02 ' as order_day,
                    1 as qty
                union all
                select
                    12 as order_id,
                    '2022-02-02' as order_day,
                    2 as qty
                union all
                select
                    13 as order_id,
                    '2022-03-02' as order_day,
                    3 as qty
                union all
                select
                    14 as order_id,
                    '2022-04-02' as order_day,
                    4 as qty
                union all
                select
                    15 as order_id,
                    '2022-04-02' as order_day,
                    5 as qty
                union all
                select
                    16 as order_id,
                    '2022-05-02' as order_day,
                    6 as qty
                union all
                select
                    9 as order_id,
                    '2021-01-02' as order_day,
                    6 as qty
                union all
                select
                    8 as order_id,
                    '2021-02-06' as order_day,
                    7 as qty
            ) t1
        group by
            date_format(order_day, 'MM')
    ) t2;

2 方法2: sum(map[''])

select
    sum(map_type ['01']) as `01`, -- 必须要带sum,不然就是多行了!!
    sum(map_type ['02']) as `02`,
    sum(map_type ['03']) as `03`,
    sum(map_type ['04']) as `04`,
    sum(map_type ['05']) as `05`
from(
        select
            map(month, sum_qty) as map_type
        from
            (
                select
                    date_format(order_day, 'MM') as month,
                    sum(qty) as sum_qty
                from
                    (
                        select
                            11 as order_id,
                            '2022-01-02' as order_day,
                            1 as qty
                        union all
                        select
                            12 as order_id,
                            '2022-02-02' as order_day,
                            2 as qty
                        union all
                        select
                            13 as order_id,
                            '2022-03-02' as order_day,
                            3 as qty
                        union all
                        select
                            14 as order_id,
                            '2022-04-02' as order_day,
                            4 as qty
                        union all
                        select
                            15 as order_id,
                            '2022-04-02' as order_day,
                            5 as qty
                        union all
                        select
                            16 as order_id,
                            '2022-05-02' as order_day,
                            6 as qty
                        union all
                        select
                            9 as order_id,
                            '2021-01-02' as order_day,
                            6 as qty
                        union all
                        select
                            8 as order_id,
                            '2021-02-06' as order_day,
                            7 as qty
                    ) t1
                group by
                    date_format(order_day, 'MM')
            ) t2
    ) t3;

方法1不带sum的结果,与方法2不带sum的结果 相同,如下:

select
    --case
    --when month = '01' THEN sum_qty
    --end as '01', --SqlParseException: Sql 1 Encountered "\'01\'" at line 4, column 12. Please check [end as '01',].
    case
        when month = '01' THEN sum_qty
    end as `01`, --SqlParseException: Sql 1 Encountered "\'01\'" at line 4, column 12. Please check [end as '01',].
    case
        when month = '02' THEN sum_qty
    end as `02`,
    case
        when month = '03' THEN sum_qty
    end as `03`,
    case
        when month = '04' THEN sum_qty
    end as `04`,
    case
        when month = '05' THEN sum_qty
    end as `05`
from
    (
        select
            date_format(order_day, 'MM') as month,
            sum(qty) as sum_qty
        from
            (
                select
                    11 as order_id,
                    '2022-01-02 ' as order_day,
                    1 as qty
                union all
                select
                    12 as order_id,
                    '2022-02-02' as order_day,
                    2 as qty
                union all
                select
                    13 as order_id,
                    '2022-03-02' as order_day,
                    3 as qty
                union all
                select
                    14 as order_id,
                    '2022-04-02' as order_day,
                    4 as qty
                union all
                select
                    15 as order_id,
                    '2022-04-02' as order_day,
                    5 as qty
                union all
                select
                    16 as order_id,
                    '2022-05-02' as order_day,
                    6 as qty
                union all
                select
                    9 as order_id,
                    '2021-01-02' as order_day,
                    6 as qty
                union all
                select
                    8 as order_id,
                    '2021-02-06' as order_day,
                    7 as qty
            ) t1
        group by
            date_format(order_day, 'MM')
    ) t2;




select
    map_type ['01'] as `01`,
    map_type ['02'] as `02`,
    map_type ['03'] as `03`,
    map_type ['04'] as `04`,
    map_type ['05'] as `05`
from(
        select
            map(month, sum_qty) as map_type
        from
            (
                select
                    date_format(order_day, 'MM') as month,
                    sum(qty) as sum_qty
                from
                    (
                        select
                            11 as order_id,
                            '2022-01-02' as order_day,
                            1 as qty
                        union all
                        select
                            12 as order_id,
                            '2022-02-02' as order_day,
                            2 as qty
                        union all
                        select
                            13 as order_id,
                            '2022-03-02' as order_day,
                            3 as qty
                        union all
                        select
                            14 as order_id,
                            '2022-04-02' as order_day,
                            4 as qty
                        union all
                        select
                            15 as order_id,
                            '2022-04-02' as order_day,
                            5 as qty
                        union all
                        select
                            16 as order_id,
                            '2022-05-02' as order_day,
                            6 as qty
                        union all
                        select
                            9 as order_id,
                            '2021-01-02' as order_day,
                            6 as qty
                        union all
                        select
                            8 as order_id,
                            '2021-02-06' as order_day,
                            7 as qty
                    ) t1
                group by
                    date_format(order_day, 'MM')
            ) t2
    ) t3;

10.png