SQL Group By Case

时间:2016-10-21 17:59:57

标签: sql oracle group-by case

我需要创建一个简化的报告,列出我销售的所有来源,并将其分解为杂项。

我之所以说简化,是因为我试图将一些东西组合在一起,这意味着所有动物销售应该被标记为寄宿费

到目前为止我的查询:

SELECT
    CASE
        WHEN aoi.is_animal = 'N' THEN TO_CHAR(aot.name)
        ELSE 'Boarding Charges'
    END AS display_name,
    aoi.is_animal,
    CASE
        WHEN aot.name = 'Misc.' THEN 'Y'
        ELSE 'N'
    END AS show_details,
    SUM(aoi.quantity * aoi.unit_price) as total
FROM ANIMAL_ORDER ao
LEFT JOIN ANIMAL_ORDER_ITEM aoi ON aoi.order_id = ao.id
LEFT JOIN ANIMAL_ORDER_TYPE aot ON aot.id = aoi.order_type_id
WHERE ao.order_stage != 'CANCELLED'
GROUP BY
    aot.name,
    CASE
        WHEN aoi.is_animal = 'N' THEN 0
        ELSE 1
    END, aoi.is_animal

我现在试图让这个变得简单,所以我并不担心Misc.的东西 - 我刚刚添加了一个列来说明Y或{{1暂时。

上面的查询结果如下:

N

正如您所看到的寄宿费用没有组合在一起,我明白原因是什么 - 我在# Resulting table DISPLAY_NAME IS_ANIMAL SHOW_DETAILS TOTALS ------------------------------------------------------------- Boarding Charges Y N 8039.53 Truck Delivery Fee N N 1005.21 Misc. N Y 237.16 Cancellation Fee N N 45.00 Late Fee N N 410.25 Courier Fee N N 1338.40 Boarding Charges Y N 311.27 Boarding Charges Y N 7341.19 条款中有aot.name。它出现的唯一原因是因为当我尝试删除它时,我在GROUP BY上收到错误,说它不是TO_CHAR(aot.name)表达式。

我只是希望将所有寄宿费用组合在一起并总结其总数。

其他信息

我试图使用this question中提到的方法。

2 个答案:

答案 0 :(得分:2)

如果您想通过display_name分组,则应在

组中重复相同的条件
  SELECT
    CASE
        WHEN aoi.is_animal = 'N' THEN TO_CHAR(aot.name)
        ELSE 'Boarding Charges'
    END AS display_name,
    aoi.is_animal,
    CASE
        WHEN aot.name = 'Misc.' THEN 'Y'
        ELSE 'N'
    END AS show_details,
    SUM(aoi.quantity * aoi.unit_price) as total
FROM ANIMAL_ORDER ao
LEFT JOIN ANIMAL_ORDER_ITEM aoi ON aoi.order_id = ao.id
LEFT JOIN ANIMAL_ORDER_TYPE aot ON aot.id = aoi.order_type_id
WHERE ao.order_stage != 'CANCELLED'
GROUP BY
    CASE
        WHEN aoi.is_animal = 'N' THEN TO_CHAR(aot.name)
        ELSE 'Boarding Charges'
    END ,
    aoi.is_animal,
    CASE
        WHEN aot.name = 'Misc.' THEN 'Y'
        ELSE 'N'
    END 

答案 1 :(得分:1)

我认为这会做你想做的事情:

SELECT (CASE WHEN aoi.is_animal = 'N' THEN TO_CHAR(aot.name)
             ELSE 'Boarding Charges'
        END) AS display_name,
       (CASE WHEN aoi.is_animal = 'N' THEN aoi.is_animal END) as is_animal,
       (CASE WHEN aoi.is_animal <> 'N' THEN NULL
             WHEN aot.name = 'Misc.' THEN 'Y'
             ELSE 'N'
        END) AS show_details,
       SUM(aoi.quantity * aoi.unit_price) as total
FROM . . .

我们的想法是将其他两个密钥设置为NULL,以支持&#34;寄宿费用&#34;行。 GROUP BY应更改为与SELECT列匹配。