1. 程式人生 > >sql中詳解round(),floor(),ceiling()函式的用法和區別?

sql中詳解round(),floor(),ceiling()函式的用法和區別?

round() 遵循四捨五入把原值轉化為指定小數位數,

如:round(1.45,0) = 1;round(1.55,0)=2

floor()向下舍入為指定小數位數 如:floor(1.45,0)= 1;floor(1.55,0) = 1

ceiling()向上舍入為指定小數位數 如:ceiling(1.45,0) = 2;ceiling(1.55,0)=2

SQL中ISNULL用法示例

  ISNULLSQL查詢示例SELECT ISNULL 使用指定的替換值替換 NULL。 語法 ISNULL ( check_expression , replacement_value ) 引數 check_expression 將被檢查是否為 NULL的表示式。check_expression 可以是任何型別的。 replacement_value 在 check_expression 為 NULL時將返回的表示式。replacement_value 必須與 check_expresssion 具有相同的型別。 返回型別 返回與 check_expression 相同的型別。 註釋 如果 check_expression 不為 NULL,那麼返回該表示式的值;否則返回 replacement_value。 示例 1 示例資料 表tb_Student及其示例資料如下圖所示。  


    2 查詢要求 查詢出其中成績(score)小於等於60的學生資訊儲存至表變數@tempTable中,當學生成績為空時,成績記為0。 ?
1 2 3 4 5 6 7 8 9 [csharp] declare @tempTable table stuname nchar(10),  stuage int,   stuscore float);  insert into @tempTable  select name,age,ISNULL(score,0) from tb_Student  where  ISNULL(score,0)<=60 
select * from @tempTable
3 執行結果  

sql 中isnull函式的用法:

declare @t table

( id int identity(1,1),

UserId varchar(10),

Odds int)

insert @t select 'a',12

union all select 'b',23

union all select 'c',34

select isnull(userid,'total') as userid,

 sum(odds) as odds  from @t

group by userid

with rollup

/**userid odds--------------

a 12

b 23

c 34

total 69**/

1. ISNULL使用指定的替換值替換 NULL。

語法ISNULL ( check_expression , replacement_value )

註釋

如果 check_expression 不為 NULL,那麼返回該表示式的值;否則返回 replacement_value。

2. ROLLUP ( )生成簡單的 GROUP BY 聚合行以及小計行或超聚合行,還生成一個總計行。

返回的分組數等於 <composite element list> 中的表示式數加一。

例如,請考慮下面的語句。

SELECT a, b, c, SUM ( <expression> )FROM T

GROUP BY ROLLUP (a,b,c)

會為 (a, b, c)、(a, b) 和 (a) 值的每個唯一組合生成一個帶有小計的行。

還將計算一個總計行。

列是按照從右到左的順序彙總的。

列的順序會影響 ROLLUP 的輸出分組,而且可能會影響結果集內的行數。

為什麼要引入ROLLUP?
可方便的生成"合計"、"小計"、"總計" 等混合統計的報表
如下資料集A經過ROLLUP運算可生成資料集B

1.ROLLUP簡單應用
SELECT
 Groups,Item,Color FROM @t GROUP BY Groups,Item,Color  
WITH ROLLUP
查詢結果如下:

如果用ROLLUP的另一個關鍵字CUBE產生的結果如下: SELECT Groups,Item,Color FROM @t GROUP BY Groups,Item,Color  WITH CUBE 引出一個概念:
維:查詢所指定的列稱為維,列的個數稱為維度
以上兩個SQL語句涉及三個維度,ROLLUP和CUBE都可以用於多維計算,不同點在於CUBE可以包含所有緯度的組合,而
ROLLUP只涉及指定列的維度計算。
2.ROLLUP運算關鍵字GROUPING
GROUPING:判斷是否為多維計算中的附加列,如果是則輸出1,否則輸出0
SELECT Groups= CASE  WHEN GROUPING(GROUPS)=1 THEN ELSE 0 END ,Item,Color FROM @t GROUP BY Groups,Item,Color WITH ROLLUP 結果: 排序應用: SELECT Groups,Item,Color FROM @t GROUP BY Groups,Item,Color WITH ROLLUP ORDER BY GROUPING(Groups),Groups DESC 結果:

SELECT * FROM @t ORDER BY groups DESC 
結果:

至於自定義附加列的樣式在第三步講解 3.ROLLUP綜合運用 SELECT Groups=CASE     
  WHEN GROUPING
(Color)=0 THEN Groups    
  WHEN GROUPING(Groups)=1 THEN '總計'   
  ELSE '' END,    
 Item=CASE     
  WHEN GROUPING
(Color)=0 THEN Item    
  WHEN GROUPING(Item)=1 THEN Groups+' 合計'   
  ELSE '' END,    
 Color=CASE     
  WHEN GROUPING
(Color)=0 THEN Color    
  WHEN GROUPING(Color)=1 THEN Item+' 小計'   
  ELSE '' END,    
 Quantity=SUM(Quantity)    
FROM @t    
GROUP BY Groups,Item,Color WITH ROLLUP   
ORDER BY GROUPING
(Groups),    
CASE WHEN GROUPING(Groups)=0 THEN Groups END  DESC,    
GROUPING(Item),    
CASE WHEN GROUPING(Item)=0 THEN Item END  DESC,    
GROUPING(Color),    
CASE WHEN GROUPING(Color)=0 THEN Color END  DESC
結果:

Cube 和 RollUp 的區別 The differences between CUBE and ROLLUP are:
  • CUBE generates a result set that shows aggregates for all combinations of values in the selected columns.

  • 可以看到Cube 比 RollUp多了三行.一比較發現,多的三行都是以Color列為緯度統計的。再結合書上說的那點區別,說RollUp是按層統計的。
    猜想區別就是Cube對每個緯度都統計了,而RollUp對Group by 後跟的第一個緯度按照值不同順序統計完後,終止在Null,NUll,1117這一行,不再繼續。
    我又加了一列Dept,調整之後再次比較結果,證實了我的猜想,RollUp以Item作為基本緯度,統計完所有情況後,就終止在Null,Null,NUll,1117這一行了。

    下面附上sql語句:
    CREATE TABLE Inventory (
    Item varchar(53) NOT NULL,
    Color varchar(53) NULL,
    Department varchar(53) Null,
    Quantity int NULL
    );

    INSERT Inventory VALUES ('Table', 'Red','IT', 223);
    INSERT Inventory VALUES ('Table', 'White','HR', 54);
    INSERT Inventory VALUES ('Table', 'Blue','ADM', 124);
    INSERT Inventory VALUES ('Chair', 'Red', 'IT',210);
    INSERT Inventory VALUES ('Chair', 'Blue','HR', 101);
    INSERT Inventory VALUES ('Chair', 'White','ADM', 23);
    INSERT Inventory VALUES ('Stand', 'Red','IT', 213);
    INSERT Inventory VALUES ('Stand', 'Blue','HR', 141);
    INSERT Inventory VALUES ('Stand', 'White','ADM', 28);

    SELECT * FROM Inventory

    SELECT Item, Color, Department,SUM(Quantity) AS Quantity
    FROM Inventory
    GROUP BY Item, Color,Department WITH CUBE;

    SELECT Item, Color, Department,SUM(Quantity) AS Quantity
    FROM Inventory
    GROUP BY Item, Color,Department WITH Rollup