SQL語句分組排序,多表關聯排序

来源:http://www.cnblogs.com/xiongzaiqiren/archive/2016/03/01/5231239.html
-Advertisement-
Play Games

SQL語句分組排序,多表關聯排序總結幾種常見的方法: 案例一: 在查詢結果中按人數降序排列,若人數相同,則按課程號升序排列? 分析:單個表內的多個欄位排序,一般可以直接用逗號分割實現。 select * from tableA order by col1 desc,col2 asc; -- 先按co


SQL語句分組排序,多表關聯排序總結幾種常見的方法:

 

案例一:

在查詢結果中按人數降序排列,若人數相同,則按課程號升序排列?

分析:單個表內的多個欄位排序,一般可以直接用逗號分割實現。

select * from tableA order by col1 desc,col2 asc;
-- 先按col1降序,相同則按col2 升序

 

案例二:

T-SQL查詢班級信息:班級人數+班級信息,按人數多少排序?

-- 創建測試數據
create table stu(sid int primary key identity(1,1),sname varchar(50),sage int,scid int foreign key references class(cid))
create table class(cid int primary key identity(1,1),code varchar(50),cname varchar(50),cgrade varchar(50))
insert into stu values('張三',19,1)
insert into stu values('李四',20,2)
insert into stu values('王五',21,2)
insert into class values('c001','1','一年級')
insert into class values('c002','2','一年級')

-- 按人數分組排序查詢
select 
  class.cgrade,
  class.code,
  class.cname,
  count(stu.sid) as 人數 
from 
  class JOIN stu
    ON (class.cid = stu.scid)
group by 
  class.cgrade,
  class.code,
  class.cname
order by 
  count(stu.sid) desc

 

案例三:

SQL 查詢統計每個用戶組發文章數量並按數量排序?

有三個表 文章表 記錄文章標題、內容、發佈人 發佈時間,用戶表 記錄用戶組id 用戶名 密碼,用戶組表 記錄id 用戶組名稱

問題是 現在要查詢每個用戶組發佈文章的數量,並且按著數量排序。不知道怎麼搞呀 大神們
還要查詢 每個月中發文排行榜....

SELECT COUNT(1) AS 數量, c.用戶組名稱 
FROM 文件表 a INNER JOIN 用戶表 b ON a.發佈人 = b.用戶名
 INNER JOIN 用戶組表 c ON b.用戶組id = c.id
 GROUP BY c.id,  c.用戶組名稱
 ORDER BY 數量

 

案例四:“圈子廣場”頁面需要展示圈子列表,查詢某類型圈子,其中需要按圈子名稱搜索,同時按照圈子人數排序。

資料庫表結構大致如下:

  圈子表“CMSocial”,欄位包括:圈子主鍵 CMSocialID,圈子名稱 SocialName,圈子狀態 SocialState等;

  圈子類型關係表“CMSocialCategoryRelation”,欄位包括 關係主鍵 CMSocialCategoryRelationID,圈子類型外鍵 CMSocialCategoryID,圈子外鍵 CMSocialID;

  圈子成員表“CMSocialMember”,欄位包括:關係主鍵 CMSocialMemberID,成員外鍵 MemberID,圈子外鍵 CMSocialID,圈子成員狀態 MemberState等;

USE [Community];

SELECT 
  S.CMSocialID,
  S.SocialName,
  S.SocialDescription,
  S.SocialLogo,
  S.SocialAuthority,
  S.SocialOwner,
  S.Integral,
  S.SocialState,
  S.IsAvailable,
  COUNT(DISTINCT SM.CMSocialMemberID) AS 'MemberNumber' /*圈子成員數*/
FROM CMSocial AS S

INNER JOIN (SELECT DISTINCT CMSocialID FROM CMSocialCategoryRelation WHERE CMSocialCategoryID IN('1','2')) AS SCR ON S.CMSocialID = SCR.CMSocialID /*內連接圈子類型*/LEFT JOIN (SELECT * FROM CMSocialMember WHERE CMSocialMember.IsDelete<>1 AND CMSocialMember.IsAvailable=1) AS SM ON S.CMSocialID = SM.CMSocialID /*左連接圈子成員*/WHERE S.IsAvailable=1 AND S.SocialState=0AND S.SocialName LIKE N'%創業圈%' /*圈子名稱匹配查詢*/GROUP BY S.CMSocialID, S.SocialName, S.SocialDescription, S.SocialLogo, S.SocialAuthority, S.SocialOwner, S.Integral, S.SocialState, S.IsAvailable ORDER BY COUNT(DISTINCT SM.CMSocialMemberID) DESC; /*圈子成員數排序*/

 

SQL 2005版本以後支持ROW_NUMBER()獲取行號,於是進一步升級,使他支持分頁,支持記錄總數:

 參考:

/* 最內層輸入分頁參數之前靠count(*) over ()獲得記錄總數,然後把這個值作為記錄的一列傳出來。*/
SELECT * FROM 
(
SELECT A.*, ROWNUM RN 
FROM (SELECT 
c1,
c2,
count(*) over () tot_cnt
FROM TABLE_NAME) A 
WHERE ROWNUM <= 40
)
WHERE RN >= 21

 

這裡總結一個SQL分頁的萬能SQL語句分頁殼子

 

USE [Community];

DECLARE @pageindex INT /*頁碼*/
DECLARE @pagesize INT /*頁數據量*/
SELECT @pageindex = 3,@pagesize = 1

SELECT A.*
FROM 
    (
        SELECT ROW_NUMBER() OVER (ORDER BY ASub.ID DESC) AS RowNumber,* FROM 
        (
            …… /*這裡寫自己的查詢語句*/
        ) AS ASub
    ) AS A
WHERE RowNumber BETWEEN ((@PageIndex-1)*(@PageSize) + 1) AND (@PageIndex)*(@PageSize)

 

整合上面的分頁SQL語句殼子,實現分頁效果:

 

USE [Community];

DECLARE @pageindex INT /*頁碼*/
DECLARE @pagesize INT /*頁數據量*/
SELECT @pageindex = 3,@pagesize = 1

SELECT A.*
FROM 
    (
        SELECT ROW_NUMBER() OVER (ORDER BY ASub.MemberNumber DESC) AS RowNumber,* FROM 
        (
            SELECT 
              S.CMSocialID,
              S.SocialName,
              S.SocialDescription,
              S.SocialLogo,
              S.SocialAuthority,
              S.SocialOwner,
              S.Integral,
              S.SocialState,
              S.IsAvailable,
              COUNT(DISTINCT SM.CMSocialMemberID) AS 'MemberNumber', /*圈子成員數*/
              COUNT(*) OVER() 'RecordNumber' /*結果總數*/
            FROM CMSocial AS S

            INNER JOIN (SELECT DISTINCT CMSocialID FROM CMSocialCategoryRelation WHERE CMSocialCategoryID IN('1','2')) AS SCR ON S.CMSocialID = SCR.CMSocialID /*內連接圈子類型*/LEFT JOIN (SELECT * FROM CMSocialMember WHERE CMSocialMember.IsDelete<>1 AND CMSocialMember.IsAvailable=1) AS SM ON S.CMSocialID = SM.CMSocialID /*左連接圈子成員*/WHERE S.IsAvailable=1 AND S.SocialState=0AND S.SocialName LIKE N'%創業圈%' /*圈子名稱匹配查詢*/GROUP BY 
              S.CMSocialID,
              S.SocialName,
              S.SocialDescription,
              S.SocialLogo,
              S.SocialAuthority,
              S.SocialOwner,
              S.Integral,
              S.SocialState,
              S.IsAvailable
        ) AS ASub
    ) AS A
WHERE RowNumber BETWEEN ((@PageIndex-1)*(@PageSize) + 1) AND (@PageIndex)*(@PageSize)

 


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

-Advertisement-
Play Games
更多相關文章
  • Sql Server的存儲過程是一個被命名的存儲在伺服器上的Transacation-Sql語句集合,是封裝重覆性工作的一種方法,它支持用戶聲明的變數、條件執行和其他強大的編程功能。 存儲過程相對於其他的資料庫訪問方法有以下的優點: (1)重覆使用。存儲過程可以重覆使用,從而可以減少資料庫開發人員的
  • mysql 主從 複製
  • 1、以下是一個簡單事務存儲過程,其中Users表ID為主鍵 CREATE PROCEDURE SP_TRANSACTIONAS BEGIN BEGIN TRANSACTION INSERT INTO USERS(ID,NAME)VALUES(1000,'TEST1000'); IF @@ERROR<
  • GRANT privilege [, ...] ON object [ ( column [, ...] ) ] [, ...] TO { PUBLIC | username [, ...] } [ WITH GRANT OPTION ] 這些欄位與 Postgres 實現是相容的,除了下麵一些例外
  • (1)選擇最有效率的表名順序(只在基於規則的優化器中有效):Oracle的解析器按照從右到左的順序處理FROM子句中的表名,FROM子句中寫在最後的表(基礎表 driving table)將被最先處理,在FROM子句中包含多個表的情況下,你必須選擇記錄條數最少的表作為基礎表。如果有3個以上的表連接查
  • 本文內容 Elasticsearch logstash 本文介紹安裝 logstash 2.2.0 和 elasticsearch 2.2.0,操作系統環境版本是 CentOS/Linux 2.6.32-504.23.4.el6.x86_64。 安裝 JDK 是必須的,一般操作系統都會有,只是版本的...
  • 關係型資料庫的定義及設計思路
  • 上一篇說了一下查詢5步走~然後就幾天_(:з」∠)_ ~今天繼續說一下其中 表裡面操作符裡面的 Pivot ~ Pivot 在實現行轉列的時候灰常有用。通常一個例子 CREATE TABLE #Tbl (Emp VARCHAR(50), [WeekDay] VARCHAR(50),LoginTime
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...