這輩子寫過的比較有意思的幾個sql

来源:http://www.cnblogs.com/c-o-d-e/archive/2016/01/10/5119832.html
-Advertisement-
Play Games

遞歸withmyRecursionas(select*fromrecursionwhereid=1unionallselectr.*frommyRecursionm,recursionrwherem.id=r.pid)select*frommyRecursionPs:unionall不去重求並集很多...


遞歸

with myRecursion as(

select * from recursion where id=1

union all select r.* from myRecursion m,recursion r where m.id=r.pid

)

select * from myRecursion

Ps:union all 不去重求並集

 

很多地方都用到了遞歸,比如asp.net mvc里的模型綁定就是遞歸綁定的,還比如樹狀菜單

 

排名

下表是一個銷售業績表,我對銷售業績做一個排名,顯示出排名結果

 

SELECT a1.Name, a1.Sales, COUNT(a2.sales) Sales_Rank

FROM ranking  a1, ranking  a2

WHERE a1.Sales < a2.Sales or (a1.Sales=a2.Sales and a1.Name = a2.Name)

GROUP BY a1.Name, a1.Sales

ORDER BY a1.Sales DESC, a1.Name DESC;

結果:

 

重點是自己和自己比較,找出a1Sales小於a2Sales的數據 或者NameSales都相等的數據(a1里的全部數據去對比a2里的每一個數據)

未分組的結果:

SELECT a1.Name, a1.Sales, a2.sales Sales_Rank

FROM ranking  a1, ranking  a2

WHERE a1.Sales < a2.Sales or (a1.Sales=a2.Sales and a1.Name = a2.Name)

結果如圖,結果一目瞭然。只要分組count一下就是排名了。

其實還有一個問題就是有併列排名,比如上圖中有個併列第3的,第四名就不存在了。

這些都可根據具體的規則用程式去調整,嘻嘻

 

去重

有時我們會遇到一些表裡有些重覆的數據,如圖:

 

第一種,去除全部重覆的數據除id以外

declare @t1 table(id int,name nchar(10),Text nchar(10))

insert into @t1(Name,Text)(select distinct Name,Text from mydistinct1)

delete from mydistinct1

insert into mydistinct1(name,text)(select name,text from @t1)

Ps:@t 定義一個虛擬表,向虛擬表裡插入用distinct去重的數據,清空原表,再把虛擬表裡的數據插入到原表。

第二種,去除指定列重覆的數據。

delete from mydistinct where id not in(select MIN(id) from mydistinct group by name)

Ps:sql很簡單,分組後取分組裡一個id,這裡取最小的一個,刪除除此之外的id

行轉列

 

select 姓名 as 姓名 ,

  max(case 課程 when '語文' then 分數 else 0 end) 語文,

  max(case 課程 when '數學' then 分數 else 0 end) 數學,

  max(case 課程 when '物理' then 分數 else 0 end) 物理

from tb

group by 姓名

結果如圖:

 

Ps:一目瞭然就不多解釋了

For xml path 現實分組後指定列的全部數據

數據表:

 

For xml path 結果如下:

select * from forxmlpath for XML path('')

 

 

分組結果:

select name,min(text) from forxmlpath group by name

 

分組後除此分組列,其他列要顯示就要使用聚合函數,只能顯示結果中的一個或數量或合計

我們可以利用for xml path的特性把全部數據都顯示在一列中,並指定顯示格式

逗號間隔:

select text+',' from forxmlpath for xml path('')

 

逗號間隔顯示分組後非分組列:

select name,(select text+',' from forxmlpath where a.name=name for XML path('')) 

from forxmlpath a group by name

 

去掉結尾的逗號:

使用 left函數截取

select name,LEFT(text,LEN(text)-1)text

from(select name,(select text+',' from forxmlpath where a.name=name for XML path('')) text

from forxmlpath a group by name)t

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • centos 7安裝docker什麼是 Docker Docker 是一個開源項目,誕生於 2013 年初,最初是 dotCloud 公司內部的一個業餘項目。它基於 Google 公司推出的 Go 語言實現。 項目後來加入了 Linux 基金會,遵從了 Apache 2.0 協議,項目代碼在 Gi....
  • 註意:我們家的電視是海信的,所以不能代表所有的電視哦~~~ 家裡電視有線電視已經過期很長時間了,早就想把電腦連接到電視上用電視做顯示器的心了,今天來興趣了,就弄了一下!!! 用電腦連接電視需要先解決兩個問題: 1、電視有介面能讓你連,例如HDMI等 備好...
  • 一、全局變數 變數 含義@@ERROR最後一SQL錯誤的錯誤號@@IDENTITY最後一次插入的標識值@@LANGUAGE當前使用的語言名稱@@MAX_CONNETIONS可以創建的、同時連接的最大數目@@ROWCOUNT受上一個SQl語句影響的行數(增加語句)@@SERV...
  • 1創建一個Storage Account1)點擊Browse->Storage accounts2) 填寫Storage account,請記住這個名字,之後創建credential需要用到。3)點擊Create。 一般等待一段時間就好了2 創建container1)All resources->B...
  • YARN DistributedShell源碼分析與修改 轉載請註明出處: "http://www.cnblogs.com/BYRans/" <br/ "1 概述" "2 YARN DistributedShell不能滿足當前需求" "2.1 功能需求" "2.2 YARN Distr...
  • 1.概述 我們熟知的資料庫引擎大部分採用靜態數據類型,即列定義的類型定義了值的存儲,並且值要嚴格滿足列的定義,同一列所有值的存儲方式都相同,比如定義了一個列類型為整型 int,不能在該列上輸入'abc'。SQLite的數據類型則採用了動態類型,列定義不能決定值的存儲,值的存儲由值本身決定,因此在.....
  • 首先大家要知道資料庫是由哪三個部分組成的.解析:01.資料庫文件:*.mdf02.次要數據文件:*.ndf03.日誌文件:*.ldf每個資料庫至少要包含兩個文件:一個數據文件和一個日誌文件.數據文件中包含了資料庫的數據和對象,如表,視圖和索引等;日誌文件中包含了用於恢複數據庫所需的信息.創建資料庫時...
  • 當一切正常時,沒有必要特別留意什麼是事務日誌,它是如何工作的。你只要確保每個資料庫都有正確的備份。當出現問題時,事務日誌的理解對於採取修正操作是重要的,尤其在需要緊急恢複數據庫到指定點時。這系列文章會告訴你每個DBA應該知道的具體細節。對於日誌文件的最大日誌吞吐量,我們從存儲架構思路的簡單回顧開始,...
一周排行
    -Advertisement-
    Play Games
  • 前言 插件化的需求主要源於對軟體架構靈活性的追求,特別是在開發大型、複雜或需要不斷更新的軟體系統時,插件化可以提高軟體系統的可擴展性、可定製性、隔離性、安全性、可維護性、模塊化、易於升級和更新以及支持第三方開發等方面的能力,從而滿足不斷變化的業務需求和技術挑戰。 一、插件化探索 在WPF中我們想要開 ...
  • 歡迎ReaLTaiizor是一個用戶友好的、以設計為中心的.NET WinForms項目控制項庫,包含廣泛的組件。您可以使用不同的主題選項對項目進行個性化設置,並自定義用戶控制項,以使您的應用程式更加專業。 項目地址:https://github.com/Taiizor/ReaLTaiizor 步驟1: ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • Channel 是乾什麼的 The System.Threading.Channels namespace provides a set of synchronization data structures for passing data between producers and consume ...
  • efcore如何優雅的實現按年分庫按月分表 介紹 本文ShardinfCore版本 本期主角: ShardingCore 一款ef-core下高性能、輕量級針對分表分庫讀寫分離的解決方案,具有零依賴、零學習成本、零業務代碼入侵適配 距離上次發文.net相關的已經有很久了,期間一直在從事java相關的 ...
  • 前言 Spacesniffer 是一個免費的文件掃描工具,通過使用樹狀圖可視化佈局,可以立即瞭解大文件夾的位置,幫助用戶處理找到這些文件夾 當前系統C盤空間 清理後系統C盤空間 下載 Spacesniffer 下載地址:https://spacesniffer.en.softonic.com/dow ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • 一、ReZero簡介 ReZero是一款.NET中間件 : 全網唯一開源界面操作就能生成API , 可以集成到任何.NET6+ API項目,無破壞性,也可讓非.NET用戶使用exe文件 免費開源:MIT最寬鬆協議 , 一直從事開源事業十年,一直堅持開源 1.1 純ReZero開發 適合.Net Co ...
  • 一:背景 1. 講故事 停了一個月沒有更新文章了,主要是忙於寫 C#內功修煉系列的PPT,現在基本上接近尾聲,可以回頭繼續更新這段時間分析dump的一些事故報告,有朋友微信上找到我,說他們的系統出現了大量的http超時,程式不響應處理了,讓我幫忙看下怎麼回事,dump也抓到了。 二:WinDbg分析 ...
  • 開始做項目管理了(本人3年java,來到這邊之後真沒想到...),天天開會溝通整理需求,他們講話的時候忙裡偷閑整理一下常用的方法,其實語言還是有共通性的,基本上看到方法名就大概能猜出來用法。出去打水的時候看到外面太陽好好,真想在外面坐著曬太陽,回來的時候好兄弟三年前送給我的鍵盤D鍵不靈了,在打"等待 ...