SQl group by用法 case when拆分列用法 having子句篩選 行合並


case when拆分列
select
CONVERT(varchar(10),createtime,120) as gr_date ,
case when status=1 then count(id) end as made,
case when status=2 then count(id) end as unmade
from ms_user_0 as ms2 --where mobile='15088719610'
group by CONVERT(varchar(10),createtime,120),status
order by CONVERT(varchar(10),createtime,120) desc

 

 

行合並

例:

select m2.mobile,
stuff((select ','+text from [user] as m1 where m1.mobile=m2.mobile for XML PATH('')),1,1,'')
as text
from [user] as m2
group by mobile

 

 

 

having

在 SQL 中增加 HAVING 子句原因是,WHERE 關鍵字無法與合計函數一起使用。

 

 

在SQL中使用GROUP BY來對SELECT的結果進行數據分組,在具體使用GROUP BY之前需要知道一些重要的規定。

  • GROUP BY子句可以包含任意數目的列。也就是說可以在組里再分組,為數據分組提供更細致的控制。
  • 如果在GROUP BY子句中指定多個分組,數據將在最后指定的分組上匯總。
  • GROUP BY子句中列出的每個列都必須是檢索列或有效的表達式(但不能是聚集函數)。如果在SELECT中使用了表達式,則必須在GROUP BY子句中指定相同的表達式。不能使用別名。
  • 出了聚集計算語句外,SELECT語句中的每一列都必須在GROUP BY子句中給出。
  • 如果分組列中有NULL值,則NULL將作為一個分組返回。如果有多行NULL值,它們將分為一組。
  • GROUP BY子句必須在WHERE子句之后,ORDER BY之前。

過濾分組

對分組過於采用HAVING子句。HAVING子句支持所有WHERE的操作。HAVING與WHERE的區別在於WHERE是過濾行的,而HAVING是用來過濾分組。

另一種理解WHERE與HAVING的區別的方法是,WHERE在分組之前過濾,而HAVING在分組之后以每組為單位過濾。

分組與排序

一般在使用GROUP BY子句時,也應該使用ORDER BY子句。這是保證數據正確排序的唯一方法。

SQL SELECT語句的執行順序:

  1. from子句組裝來自不同數據源的數據;
  2. where子句基於指定的條件對記錄行進行篩選;
  3. group by子句將數據划分為多個分組;
  4. 使用聚集函數進行計算;
  5. 使用having子句篩選分組;
  6. 計算所有的表達式;
  7. 使用order by對結果集進行排序;
  8. select 集合輸出。

舉個例子吧。

1 select 考生姓名, max(總成績) as max總成績
2 from tb_Grade
3 where 考生姓名 is not null
4 group by 考生姓名
5 having max(總成績) > 600
6 order by max總成績

在上面的示例中 SQL 語句的執行順序如下:

  1. 首先執行 FROM 子句, 從 tb_Grade 表組裝數據源的數據
  2. 執行 WHERE 子句, 篩選 tb_Grade 表中所有數據不為 NULL 的數據
  3. 執行 GROUP BY 子句, 把 tb_Grade 表按 "學生姓名" 列進行分組
  4. 計算 max() 聚集函數, 按 "總成績" 求出總成績中最大的一些數值
  5. 執行 HAVING 子句, 篩選課程的總成績大於 600 分的
  6. 執行 ORDER BY 子句, 把最后的結果按 "Max 成績" 進行排序

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM