簡體   English   中英

計算兩個計數之間的差異(*)

[英]Computing Difference between two count(*)

我有兩個對同一個表進行操作並返回 avg(*) 結果的查詢。 我想選擇兩個值之間的差異,但我無法做到。 請幫忙。

我試過使用

Select t1.l1 - t2.l2
from (select avg(col) as l1 from...) as t1,
     (select avg(col) as l2 from...) as t2;

但它不斷給我錯誤信息。 說缺少右括號等。

在特定列上使用AVG而不是*並且不需要CROSS JOIN

SqlFiddleDemo

CREATE TABLE ta1(col INT);
INSERT INTO ta1 VALUES(5);
CREATE TABLE ta2(col INT);
INSERT INTO ta2 VALUES(3);

SELECT 
  (select avg(col) as l1 from ta1) - (select avg(col) as l2 from ta2) AS result
FROM  DUAL;

另一種可能:

SqlFiddleDemo2

SELECT SUM(l1) AS result
FROM(
  select avg(col) as l1 from ta1
  UNION ALL
  select - avg(col) as l1 from ta2
  ) t;

我很確定count()是少數可以與*一起使用的聚合函數之一,因為在這種情況下,它只計算實際列內容無關緊要的所有記錄。

對於平均值、最大值、最小值等,它們需要處理數據,因此您需要為它們提供一個實際的列。

來自avgOracle 文檔(我的重點):

此函數將任何數字數據類型或任何可以隱式轉換為數字數據類型的非數字數據類型作為參數 該函數返回與參數的數值數據類型相同的數據類型。

或者,以圖形形式在此處輸入圖片說明


另一方面, count 包括這個子句:

如果指定星號 (*),則此函數返回所有行,包括重復行和空行。

在此處輸入圖片說明

所以你可以看到在avg函數中使用*是不被允許的。

我會在 sql 中執行以下操作:

SELECT SUM(l1) - sum(l2) from
(
SELECT avg(fieldname) as l1 , 0 as l2
  FROM table as t1
  UNION
  select 0, avg(fieldname) as l2 from table as t2
  )as t1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM