CAST & CASE WHEN
1. 利用 CAST 可以修改資料的型別,下面示例中,原本SQL返回的資料型別為decimal,被修改成為整數型;
2. 利用Case when 語句,實現pivot 功能,下面SQL語句實現的搜尋結果為下圖
SELECT DATE_FORMAT(uniic_db.app_miniline_yield_miniline_yield.Date_Test, '%Y%m') AS months, CAST(SUM(CASE WHEN (Board_Type = 'D2 U/SO-DIMM' AND PO_Type <> 'F') THEN QTY_Test ELSE0 END) AS SIGNED) AS 'D2 U/SO-DIMM', CAST(SUM(CASE WHEN (Board_Type = 'D3 U/SO-DIMM' AND PO_Type <> 'F') THEN QTY_Test ELSE 0 END) AS SIGNED) AS 'D3 U/SO-DIMM', CAST(SUM(CASE WHEN (Board_Type = 'D4 U/SO-DIMM' AND PO_Type <> 'F') THEN QTY_Test ELSE 0 END) AS SIGNED) AS 'D4 U/SO-DIMM',CAST(SUM(CASE WHEN (Board_Type = 'D3 R-DIMM' AND PO_Type <> 'F') THEN QTY_Test ELSE 0 END) AS SIGNED) AS 'D3 R-DIMM', CAST(SUM(CASE WHEN ((Board_Type='D4 R-DIMM(Z10PE)' or Board_Type= 'D4 R-DIMM(Z11PA)' or Board_Type= 'D4 R-DIMM') AND PO_Type <> 'F') THEN QTY_Test ELSE 0 END) AS SIGNED) AS'D4 R-DIMM', CAST(SUM(CASE WHEN PO_Type <>'F' THEN QTY_Test else 0 end) as signed ) AS 'test_qty', CAST(SUM(CASE WHEN PO_Type <>'xxxxx' THEN QTY_Test else 0 end) as signed ) AS 'NO_test_qty' FROM uniic_db.app_miniline_yield_miniline_yield GROUP BY months order by months ;
搜尋結果:
CAST函式:
CAST函式用於將某種資料型別的表示式顯式轉換為另一種資料型別。CAST()函式的引數是一個表示式,它包括用AS關鍵字分隔的源值和目標資料型別。
語法:CAST (expression AS data_type)
expression:任何有效的SQServer表示式。
AS:用於分隔兩個引數,在AS之前的是要處理的資料,在AS之後是要轉換的資料型別。
data_type:目標系統所提供的資料型別,包括bigint和sql_variant,不能使用使用者定義的資料型別。
可以轉換的型別是有限制的。這個型別可以是以下值其中的一個:
- 二進位制,同帶binary字首的效果 : BINARY
- 字元型,可帶引數 : CHAR()
- 日期 : DATE
- 時間: TIME
- 日期時間型 : DATETIME
- 浮點數 : DECIMAL
- 整數 : SIGNED
- 無符號整數 : UNSIGNED
例子:
1.SELECT CAST('109.024' AS decimal) 結果:109
2.SELECT CAST('24356349.5535772' AS decimal(30,3)) 結果:'24356349.554' (精度與小數位數分別為30與3。精度是總的數字位數,包括小數點左邊和右邊位數的總和。而小數位數是小數點右邊的位數)
3.SELECT CAST(NOW() AS DATE)結果:'2020-07-30' 原本NOW() 是DATETIME 型別,被更改為DATE型別;
Case 函式
case具有兩種格式。簡單case函式和case搜尋函式。
-- 簡單 Case 函式 case sex when '1' then '男' when '2' then '女' else '其他' end --case 搜尋函式 case when sex = '1' then '男' when sex = '2' then '女' else '其他' end
這兩種方式,可以實現相同的功能。簡單case函式的寫法相對比較簡潔,但是和case搜尋函式相比,功能方面會有些限制,比如寫判定式。
還有一個需要注重的問題,case函式只返回第一個符合條件的值,剩下的case部分將會被自動忽略。
--比如說,下面這段sql,你永遠無法得到“第二類”這個結果
case when col_1 in ( 'a', 'b') then'第一類' when col_1 in ('a') then '第二類' else'其他'end
下面我們來看一下,使用case函式都能做些什麼事情。
一,已知資料按照另外一種方式進行分組,分析。
有如下資料:
國家(country) |
人口(population) |
中國 |
600 |
美國 |
100 |
加拿大 |
100 |
英國 |
200 |
法國 |
300 |
日本 |
250 |
德國 |
200 |
墨西哥 |
50 |
印度 |
250 |