① sql server中什麼是聚合函數
count() 所有記錄數
count(*)所有非null記錄數
avg() 某一列平均值
min() 某一列最小值
max() 某一列最大值
sum() 某一列總和
② sql 語句中那些是聚合函數
常見聚合函數,max(最大)、min(最小)、sum(求和)、avg(平均)等,
示例如下,
1、創建測試表,
create table test_group(id number, value number);
③ 為什麼sql查詢語句中的count(*)等聚合函數可以放在having後面,而不能放在where後面
因為where先於group by執行,當執行where的時候還沒有分組,沒有東西可以數,所以聚合函數只能放在比group by先執行的指令里
④ sql語句中group by,聚合函數的使用。單行子查詢返回多行怎麼辦求解答!
兩個辦法。
(1)聯合查詢(oracle寫法,如為其他資料庫自行修改,這里只提供思路)
select table.id,table.XXXXX,table.XXXXX,table.caption,table.XXXXX from table,(select id,max(caption) max_cap from table group by id) b where table.id=b.id and table.caption=b.max_cap
(2)組合查詢
select * from table where id||'_'||caption in (select id||'_'||max(caption) max_cap from table group by id)
加_是為了方防止出現特殊情況,比如id=1,caption=130 和id=11,caption=30的情況出現
不知道你是什麼資料庫,||是Oracle的連接符,用於連接字元串,其他資料庫應該也有類似的東西,這個就自己掌握吧
⑤ SqlServer如何用Sql語句自定義聚合函數
有兩個寫法:
select*fromtblDept
whereidin(
count(casewhenSalary>3000then1elsenullend)*1.0/count(*)>0.5)
或
select*fromtblDept
whereidin(
sum(casewhenSalary>3000then1else0end)*1.0/count(*)>0.5)
⑥ sql中常用的聚合函數有哪些(sql聚合函數)
聚合函數是對一組值執行計算並返回單一的值的函數,它經常與SELECT語句的GROUPBY子句一同使用,SQLSERVER中具體有哪些聚者正合函數呢?我們來一一看一下:
1.AVG返回指定組中的平均值,空值被忽略。
例:selectprd_no,avg(qty)fromsalesgroupbyprd_no
2.COUNT返回指定組中項目的數量。
例:selectcount(prd_no)fromsales
3.MAX返回指定數據的最大值。
例:selectprd_no,max(qty)fromsalesgroupbyprd_no
4.MIN返回指定數據的最小值。
例:selectprd_no,min(qty)fromsalesgroupbyprd_no
5.SUM返回指定數據的和,只能用於數字列,空值被忽略。
例:selectprd_no,sum(qty)fromsalesgroupbyprd_no
6.COUNT_BIG返回指定組中的項目數量,與COUNT函數不同的是COUNT_BIG返回bigint值,而COUNT返型頃回的是int值。
例:selectcount_big(prd_no)fromsales
7.GROUPING產生一個附加的列,當用CUBE或ROLLUP運算符添加行時,輸出值為1.當所添加的行不是由CUBE或ROLLUP產生時,輸出值為0.
例:selectprd_no,sum(qty),grouping(prd_no)fromsalesgroupbyprd_nowithrollup
8.BINARY_CHECKSUM返回對表中的行或表達式列表計卜嫌陸算的二進制校驗值,用於檢測表中行的更改。
例:selectprd_no,binary_checksum(qty)fromsalesgroupbyprd_no
9.CHECKSUM_AGG返回指定數據的校驗值,空值被忽略。
例:selectprd_no,checksum_agg(binary_checksum(*))fromsalesgroupbyprd_no
10.CHECKSUM返回在表的行上或在表達式列表上計算的校驗值,用於生成哈希索引。
11.STDEV返回給定表達式中所有值的統計標准偏差。
例:selectstdev(prd_no)fromsales
12.STDEVP返回給定表達式中的所有值的填充統計標准偏差。
例:selectstdevp(prd_no)fromsales
13.VAR返回給定表達式中所有值的統計方差。
例:selectvar(prd_no)fromsales
14.VARP返回給定表達式中所有值的填充的統計方差。
例:selectvarp(prd_no)fromsales
⑦ sql聚合函數有哪些
聚集函數
和大多數其它關系資料庫產品一樣,PostgreSQL
支持聚集函數。一個聚集函數從多個輸入行中計算出一個結果。比如,我們有在一個行集合上計算
count(數目),
sum(總和),
avg(均值),
max(最大值),
min(最小值)的函數。
比如,我們可以用下面的語句找出所有低溫中的最高溫度:
SELECT
max(temp_lo)
FROM
weather;
max
-----
46
(1
row)如果我們想知道該讀數發生在哪個城市,可能會用:
SELECT
city
FROM
weather
WHERE
temp_lo
=
max(temp_lo);
--
錯!不過這個方法不能運轉,因為聚集函數
max
不能用於
WHERE
子句中。存在這個限制是因為
WHERE
子句決定哪些行可以進入聚集階段;因此它必需在聚集函數之前計算。不過,我們可以用其它方法實現這個目的;這里我們使用子查詢:
SELECT
city
FROM
weather
WHERE
temp_lo
=
(SELECT
max(temp_lo)
FROM
weather);
city
---------------
San
Francisco
(1
row)這樣做是可以的,因為子查詢是一次獨立的計算,它獨立於外層查詢計算自己的聚集。
聚集同樣也常用於
GROUP
BY
子句。比如,我們可以獲取每個城市低溫的最高值:
SELECT
city,
max(temp_lo)
FROM
weather
GROUP
BY
city;
city
|
max
---------------+-----
Hayward
|
37
San
Francisco
|
46
(2
rows)這樣每個城市一個輸出。每個聚集結果都是在匹配該城市的行上面計算的。我們可以用
HAVING
過濾這些分組:
SELECT
city,
max(temp_lo)
FROM
weather
GROUP
BY
city
HAVING
max(temp_lo)
<
40;
city
|
max
---------+-----
Hayward
|
37
(1
row)這樣就只給出那些
temp_lo
值曾經有低於
40
度的城市。最後,如果我們只關心那些名字以"S"開頭的城市,我們可以用:
SELECT
city,
max(temp_lo)
FROM
weather
WHERE
city
LIKE
'S%'
GROUP
BY
city
HAVING
max(temp_lo)
<
40;語句中的
LIKE
執行模式匹配,在節9.7里有解釋。
理解聚集和
SQL
的
WHERE
和
HAVING
子句之間的關系非常重要。WHERE
和
HAVING
的基本區別如下:WHERE
在分組和聚集計算之前選取輸入行(它控制哪些行進入聚集計算),而
HAVING
在分組和聚集之後選取輸出行。因此,WHERE
子句不能包含聚集函數;因為試圖用聚集函數判斷那些行將要輸入給聚集運算是沒有意義的。相反,HAVING
子句總是包含聚集函數。當然,你可以寫不使用聚集的
HAVING
子句,但這樣做沒什麼好處,因為同樣的條件可以更有效地用於
WHERE
階段。
在前面的例子里,我們可以在
WHERE
里應用城市名稱限制,因為它不需要聚集。這樣比在
HAVING
里增加限制更加高效,因為我們避免了為那些未通過
WHERE
檢查的行進行分組和聚集計算。
⑧ sql語句中如何將聚合函數值和另一個值相乘
sql中提供的聚合函數,通常包括sum,count,avg,max,min,但不包括乘法;
比如有這樣一個數據集:
id x
1 1
1 2
1 3
2 4
2 5
2 6
;
想實現成如下形式
id prob_x
1 6
2 120
即讓第一組中1*2*3=6
第二組中4*5*6=120
用data步中first+retain可以實現,但data需要先排序;
而sql的聚合函數中也沒有相乘這一函數,於是有些牛人想到通過數學轉化,將乘法轉為加法,而sql中可以
用sum實現加法聚合。
說來也簡單,主要想法就是A*B=exp(lnA*B)=exp(lnA+lnB);
select id,exp(sum(log(x))) as prob_x from data_set group by id;
=============================================
但我覺得也需要補充一點東西:
首先有0的情況下,log函數的定義域為{x>0},有0出現的時候,改組最後結果肯定為0;
其次是有負數的情況,需要對絕對值進行計算,計算每組負數的個數,如果負數是偶數個,那麼結果為正,
如果為奇數個,則需要在結果上添上負號。
最後可以寫成這樣
select id,(case when sum(case when x=0 then 1 else 0 end) >0 then 0
when mod(sum(case when x<0 then 1 else 0 end),2)=0 then exp(sum(log(x)))
else -1*exp(sum(log(abs(x)))) end) as prod_x from data_set group by id;