SQL Group By with Case
我需要创建一个简化的报告,其中列出了我所有的销售来源,并将其细分为杂项 我之所以说“简化”是因为我试图把一些东西组合在一起,这意味着所有的动物销售都应该贴上登机费的标签 以下是我目前的疑问:SQL Group By with Case,sql,oracle,group-by,case,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, CA
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
或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
正如您所看到的,登机费没有组合在一起,我知道原因是什么-我在GROUP BY
子句中有aot.name
。它存在的唯一原因是,当我试图删除它时,我在to_CHAR(aot.name)
上得到一个错误,说它不是GROUP BY
表达式
我只想把所有的寄宿费归在一起,并把总数加起来
补充资料
我正在尝试使用中提到的方法。我认为这将满足您的要求:
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 . . .
SELECT(如果aoi.is_animal='N',则选择TO_CHAR(aot.name)
其他“登机费”
结束)作为显示名称,
(当aoi.is_animal='N'时,则为aoi.is_animal END)as is_animal,
(如果aoi.is_animal'N'则为空
当aot.name='Misc'时,然后是'Y'
否则
结束)如图所示,
总计(aoi.数量*aoi.单价)
从…起
想法是将“登机费”行的其他两个键设置为
NULL
。分组依据
应更改为与选择
列相匹配。如果要按显示名称分组,应在分组依据中重复相同的条件
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
只要我删除
GROUP BY
子句上的别名,似乎就可以工作。在oracle中,查询也应该使用列别名。。我只在示例中使用了平面代码..因为aot.name与display_name的大小写不同..无论如何,我还更新了别名的asnwer。。。让我知道不行。我得到一个错误,说ORA-00904:“show_details”:无效标识符
@scaisEdge-OP所说的是最后的“AS show_details”不起作用-显然它不起作用(我假设在任何类型的SQL中)。当然,在整个CASE表达式中,其他别名也起作用;但是您不能在GROUP BY中对大小写表达式的结果进行别名。@mathguy。答案更新:通过此删除别名组确实解决了无法将所有登机费分组的问题,但我不明白在其他两列上设置null
的目的是什么。我想我更喜欢@scaisEdge的答案“仍然领先。”@PatrickGregorio。嗯,其他列的“登机费”行可能有不同的值。然后将结果分散到多行。此版本保证“登机费”仅在一行,而不考虑其他列的值。因此,这是对这个问题更具弹性的回答。