我有一個名為的表fact_trip,其中有一列 as fare_final,我想找到值之間的差異。
SQL> desc fact_trip
Name Null? Type
----------------------------------------- -------- ----------------------------
TRIP_UUID NOT NULL VARCHAR2(20)
DATESTR DATE
PRODUCT_TYPE_NAME VARCHAR2(20)
CITY_ID NUMBER
DRIVER_UUID VARCHAR2(50)
IS_COMPLETED VARCHAR2(10)
ETA NUMBER
ATA NUMBER
UFP_FARE NUMBER(4,2)
FARE_FINAL NUMBER(4,2)
因此,當我這樣做時,我將 NULL 作為輸出:
SQL> select sum(fare_final) from fact_trip where to_char(datestr, 'W')=1 - (select sum(fare_final) from fact_trip where to_char(datestr, 'W')=2);
SUM(FARE_FINAL)
---------------
我什至嘗試像這樣單獨執行這些選擇查詢:
SQL> select sum(fare_final) from fact_trip where to_char(datestr, 'W')=1;
SUM(FARE_FINAL)
---------------
1821.6
SQL> select sum(fare_final) from fact_trip where to_char(datestr, 'W')=2;
SUM(FARE_FINAL)
---------------
67
這當然是獲取結果。但是,當我運行這些查詢以獲取我想要的差異時,它顯示為 NULL。就像我想要它們的區別(1821.6 - 67)。任何人都可以告訴它有什么問題嗎?謝謝!
uj5u.com熱心網友回復:
SQL 不是作業表,您可以在其中計算任何運算式。您不能將運算式用作 SQL 命令:您必須使用select某個運算式from,或者在 PL/SQL 塊中計算它。
您想計算差異,因此您假設您的代碼是:subquery - subquery。但是由于上面的描述,這不是語法正確的命令,決議器試圖找到一個語法正確的決議樹。它實際上找到了一個:
select sum(fare_final)
from fact_trip
where to_char(datestr, 'W') = (
1 - (
select sum(fare_final)
from fact_trip
where to_char(datestr, 'W') = 2
)
)
當然,這樣的一周不存在,你會得到null結果。
把你的代碼放到一個正確的命令,最簡單的辦法就是select在表達從dual適當的括號指定計算優先級表:
select
(select sum(fare_final) from fact_trip where to_char(datestr, 'W')='1')
- (select sum(fare_final) from fact_trip where to_char(datestr, 'W')='2') as res
from dual
但更高效和基于集合的方法是:
select
sum(
case to_char(datestr, 'W')
when '1' then 1
when '2' then -1
end * fare_final
) as res
from fact_trip
where to_char(datestr, 'W') in ('1', '2')
以下是包含上述所有結果的示例代碼:
select * from t身份證 | 價值 -: | ——: 1 | 3 2 | 6 3 | 9
select sum(val) from t where id = 1 - ( select sum(val) from t where id = 2 )| 總和(VAL) | | -------: | | 空|
select ( (select sum(val) from t where id = 1) - ( select sum(val) from t where id = 2 ) ) as q from dual| 問 | | -: | | -3 |
select sum( case id when 1 then 1 when 2 then -1 end * val ) as res from t where id in (1, 2)| 資源 | | --: | | -3 |
db<>在這里擺弄
uj5u.com熱心網友回復:
應該
SELECT SUM (
CASE
WHEN TO_CHAR (datestr, 'W') = 1 THEN fare_final
WHEN TO_CHAR (datestr, 'W') = 2 THEN -fare_final
END)
FROM fact_trip;
我沒有你的表格,所以我將在 Scott 的 EMP 上進行說明,計算分析師和文員的總數:
SQL> SELECT job, sal FROM emp ORDER BY job;
JOB SAL
--------- ----------
ANALYST 3000 --> total for analysts is 6000
ANALYST 3000
CLERK 1300 --> total for clerks is 4150
CLERK 950
CLERK 800 --> difference: 6000 - 4150 = 1850
CLERK 1100
MANAGER 2850
MANAGER 2975
MANAGER 2450
PRESIDENT 5000
SALESMAN 1500
SALESMAN 1250
SALESMAN 1250
SALESMAN 1600
14 rows selected.
SQL> SELECT SUM (
2 CASE WHEN job = 'ANALYST' THEN sal
3 WHEN job = 'CLERK' THEN -sal
4 END) total
5 FROM emp;
TOTAL
----------
1850
SQL>
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/399911.html
