SELECT
TO_CHAR(order_date, 'YYYY-MM'),
product_id,
SUM(quantity) sum_quan,
ROW_NUMBER() OVER ( ORDER BY order_date) RN
FROM customer_orders
WHERE 1 = 1
AND product_id = 2
AND To_char(order_date, 'YYYY-MM') BETWEEN To_char(Add_months(order_date, -1), 'YYYY-MM') AND To_char(order_date, 'YYYY-MM')
GROUP BY 1,2;
嗨,我對使用 TO_CHAR FUNCTION 的 GROUP BY 有疑問。有誰知道如何解決這個問題?
uj5u.com熱心網友回復:
您的查詢有兩個主要問題:
- 您正在按數字 1 和 2 進行分組。您可能認為您正在按位置 1 和 2 的列進行分組,但事實并非如此。Oracle中沒有位置
GROUP BY。 - 您正在呼叫 上的視窗函式
order_date,但此列不在您的中間結果中。它既不分組也不聚合。你可能想要TO_CHAR(order_date, 'YYYY-MM')。
另一個問題是語意問題:
WHERE TO_CHAR(order_date, 'YYYY-MM') BETWEEN ... AND TO_CHAR(order_date, 'YYYY-MM')
對于每一行都是如此,因為每個訂單日期都匹配自己(NULL 除外,但我猜您的表中沒有訂單日期沒有訂單)。也許您想與當前日期進行比較?您是否要查看上個月或本月訂購的所有訂單?但是,為什么BETWEEN?將來應該找不到任何訂單。表中最新的訂單最多可以是今天。
更正后的查詢:
SELECT
TO_CHAR(order_date, 'YYYY-MM'),
product_id,
SUM(quantity) AS sum_quan,
ROW_NUMBER() OVER (ORDER BY TO_CHAR(order_date, 'YYYY-MM')) AS rn
FROM customer_orders
WHERE 1 = 1
AND product_id = 2
AND order_date >= ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -1)
GROUP BY TO_CHAR(order_date, 'YYYY-MM'), product_id
ORDER BY TO_CHAR(order_date, 'YYYY-MM'), product_id;
uj5u.com熱心網友回復:
也許你只需要這個,我猜這里。而且我不明白為什么你有 row_number()
SELECT
od,
product_id,
SUM(quantity) quan
from
(
SELECT
TO_CHAR(order_date, 'YYYY-MM') as od,
quantity,
product_id,
ROW_NUMBER() OVER ( ORDER BY order_date) RN
FROM customer_orders
WHERE 1 = 1
AND product_id = 2
AND To_char(order_date, 'YYYY-MM')
BETWEEN To_char(Add_months(order_date, -1), 'YYYY-MM')
AND To_char(order_date, 'YYYY-MM')
)T
GROUP BY od,product_id;
uj5u.com熱心網友回復:
您應該使用此方法對 GROUP BY TO_CHAR(order_date, 'YYYY-MM') 進行分組,product_id Oracle 不提供位置分組。Oracle 通過使用 order by 子句提供位置符號進行排序
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/461889.html
