Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Group By with Case_Sql_Oracle_Group By_Case - Fatal编程技术网

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。嗯,其他列的“登机费”行可能有不同的值。然后将结果分散到多行。此版本保证“登机费”仅在一行,而不考虑其他列的值。因此,这是对这个问题更具弹性的回答。