【數據庫】使用Sql Server將分組后指定字段的行數據轉為一個字段顯示,并且以逗號隔開每個值,收藏不迷路

大家好,我是全棧小5,歡迎來到《小5講堂》。
這是《Sql Server》系列文章,每篇文章將以博主理解的角度展開講解。
溫馨提示:博主能力有限,理解水平有限,若有不對之處望指正!

在這里插入圖片描述

目錄

  • 前言
  • 示例
    • 數據集
    • 數據分組
    • 增加排序
  • 查詢小技巧
    • 1. 使用 `WITH TIES` 獲取并列結果(分頁查詢時特別有用)
    • 2. 使用 `OUTPUT` 子句捕獲DML操作結果(避免二次查詢)
    • 3. 使用 `CROSS APPLY` 優化復雜查詢(替代JOIN的更好選擇)
  • 文章推薦

前言

很久沒有寫報表了,今天嘗試寫下報表就遇到了一個常見但是太久了有點忘了的知識點。
那就是如何讓指定字段的行數據轉為一個字段顯示并以逗號的形式隔開,一起來探討下!

示例

STRING_AGG 是SQL Server 2017引入的新函數,更簡潔高效

數據集

模擬表格數據,如下

select '張三' as NameText,'語文' as SubjectText
union all
select '張三' as NameText,'數學' as SubjectText
union all
select '張三' as NameText,'英語' as SubjectText
union all
select '張三' as NameText,'物理' as SubjectText
union all
select '張三' as NameText,'化學' as SubjectText
union all
select '張三' as NameText,'生物' as SubjectText
union all
select '張三' as NameText,'歷史' as SubjectText
union all
select '張三' as NameText,'政治' as SubjectText
union all
select '張三' as NameText,'地理' as SubjectText
union all
select '張三' as NameText,'體育' as SubjectText
union all
select '張三' as NameText,'音樂' as SubjectText
union all
select '張三' as NameText,'美術' as SubjectText
union all
select '李四' as NameText,'體育' as SubjectText
union all
select '李四' as NameText,'音樂' as SubjectText
union all
select '李四' as NameText,'美術' as SubjectText

在這里插入圖片描述

數據分組

以姓名為分組,增加多一個科目字段,并且科目名稱以逗號形式隔開,效果如下:
在這里插入圖片描述

string_agg(cast(字段 as varchar), ‘,’) as 自定義名稱

select t.NameText
,string_agg(cast(t.SubjectText as varchar), ',') as ALLSubject
from(select '張三' as NameText,'語文' as SubjectTextunion allselect '張三' as NameText,'數學' as SubjectTextunion allselect '張三' as NameText,'英語' as SubjectTextunion allselect '張三' as NameText,'物理' as SubjectTextunion allselect '張三' as NameText,'化學' as SubjectTextunion allselect '張三' as NameText,'生物' as SubjectTextunion allselect '張三' as NameText,'歷史' as SubjectTextunion allselect '張三' as NameText,'政治' as SubjectTextunion allselect '張三' as NameText,'地理' as SubjectTextunion allselect '張三' as NameText,'體育' as SubjectTextunion allselect '張三' as NameText,'音樂' as SubjectTextunion allselect '張三' as NameText,'美術' as SubjectTextunion allselect '李四' as NameText,'體育' as SubjectTextunion allselect '李四' as NameText,'音樂' as SubjectTextunion allselect '李四' as NameText,'美術' as SubjectText
) t
group by t.NameText

增加排序

通過輸出結果可能會注意到,以逗號隔開的文本不是按順序,和表格本身排序不一致。
假設根據id進行升序排序輸出,確保一致,如下:
在這里插入圖片描述

string_agg(cast(字段 as varchar), ‘,’) within group (order by 排序字段 asc) as 自定義名稱

select t.NameText
,string_agg(cast(t.SubjectText as varchar), ',') within group (order by t.id asc) as ALLSubject
from(select 1 as id,'張三' as NameText,'語文' as SubjectTextunion allselect 2 as id,'張三' as NameText,'數學' as SubjectTextunion allselect 3 as id,'張三' as NameText,'英語' as SubjectTextunion allselect 4 as id,'張三' as NameText,'物理' as SubjectTextunion allselect 5 as id,'張三' as NameText,'化學' as SubjectTextunion allselect 6 as id,'張三' as NameText,'生物' as SubjectTextunion allselect 7 as id,'張三' as NameText,'歷史' as SubjectTextunion allselect 8 as id,'張三' as NameText,'政治' as SubjectTextunion allselect 9 as id,'張三' as NameText,'地理' as SubjectTextunion allselect 10 as id,'張三' as NameText,'體育' as SubjectTextunion allselect 11 as id,'張三' as NameText,'音樂' as SubjectTextunion allselect 12 as id,'張三' as NameText,'美術' as SubjectTextunion allselect 13 as id,'李四' as NameText,'體育' as SubjectTextunion allselect 14 as id,'李四' as NameText,'音樂' as SubjectTextunion allselect 15 as id,'李四' as NameText,'美術' as SubjectText
) t
group by t.NameText

查詢小技巧

以下是三個能提高你SQL Server查詢效率和便利性的實用技巧:

1. 使用 WITH TIES 獲取并列結果(分頁查詢時特別有用)

-- 獲取前10條記錄,包括與第10條記錄值相同的所有記錄
SELECT TOP 10 WITH TIES column1, column2
FROM table_name
ORDER BY column1 DESC;

應用場景:當你想獲取排名靠前的記錄,但不想因為TOP N的限制而遺漏與第N條記錄值相同的其他記錄。

2. 使用 OUTPUT 子句捕獲DML操作結果(避免二次查詢)

-- 更新數據同時返回被更新的記錄
UPDATE table_name
SET column1 = 'new_value'
OUTPUT inserted.*  -- 返回更新后的數據
WHERE condition;-- 刪除數據同時返回被刪除的記錄
DELETE FROM table_name
OUTPUT deleted.*  -- 返回被刪除的數據
WHERE condition;

優勢:減少數據庫往返次數,提高效率,特別適合需要記錄變更的場景。

3. 使用 CROSS APPLY 優化復雜查詢(替代JOIN的更好選擇)

-- 獲取每個客戶的最新訂單
SELECT c.CustomerID, c.CustomerName, o.OrderDate, o.Amount
FROM Customers c
CROSS APPLY (SELECT TOP 1 OrderDate, AmountFROM OrdersWHERE CustomerID = c.CustomerIDORDER BY OrderDate DESC
) o;

優勢

  • 比子查詢更高效
  • 比LEFT JOIN + GROUP BY更簡潔
  • 特別適合需要為每行主表獲取一個相關子表記錄的場景

這些技巧能幫助你寫出更高效、更簡潔的SQL查詢語句,提高數據庫操作效率。

文章推薦

【數據庫】使用Sql Server將分組后指定字段的行數據轉為一個字段顯示,并且以逗號隔開每個值,收藏不迷路

【數據庫】SQL Server 查詢條件小技巧:ISNULL 函數的使用,有請DeepSeek來輔助講解下

【Sql Server】在SQL Server中生成雪花ID(Snowflake ID)

【Sql Server】使用row_number over方式進行表分頁,數據量達到五千多條記錄后,查詢變慢需要20多秒的解決方案

【Sql Server】隨機查詢一條表記錄,并重重溫回顧下自定義函數的封裝和使用

【Sql Server】鎖表如何解鎖,模擬會話事務方式鎖定一個表然后進行解鎖

【Sql Server】通過Sql語句批量處理數據,使用變量且遍歷數據進行邏輯處理

【新星計劃回顧】第六篇學習計劃-通過自定義函數和存儲過程模擬MD5數據

【新星計劃回顧】第四篇學習計劃-自定義函數、存儲過程、隨機值知識點

【Sql Server】Update中的From語句,以及常見更新操作方式

【Sql server】假設有三個字段a,b,c 以a和b分組,如何查詢a和b唯一,但是c不同的記錄

【Sql Server】新手一分鐘看懂在已有表基礎上修改字段默認值和數據類型

總結:溫故而知新,不同階段重溫知識點,會有不一樣的認識和理解,博主將鞏固一遍知識點,并以實踐方式和大家分享,若能有所幫助和收獲,這將是博主最大的創作動力和榮幸。也期待認識更多優秀新老博主。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/916589.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/916589.shtml
英文地址,請注明出處:http://en.pswp.cn/news/916589.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

7.項目起步(1)

1,項目起步-初始化項目并使用git管理創建項目并精細化配置src目錄調整git 管理項目2項目起步-配置別名路徑聯想提示什么是別名路徑聯想提示如何進行配置 (自動配置了){"compilerOptions" : {"baseUrl" : "./",…

【C++詳解】深入解析繼承 類模板繼承、賦值兼容轉換、派生類默認成員函數、多繼承與菱形繼承

文章目錄一、繼承概念二、繼承定義定義格式繼承后基類成員訪問方式的變化類模板的繼承三、基類和派?類間的轉換(賦值兼容轉換)四、繼承中的作用域隱藏規則兩道筆試常考題五、派生類的默認成員函數四個常見默認成員函數實現?個不能被繼承的類六、繼承與友元七、繼承與靜態成員…

加法器 以及ALU(邏輯算術單元)

加法器框架,首先介紹原理,然后引入一位加法器最后再引入多位加法器最后引入帶符號的加法器這一節涉及到的硬件電路的知識理解就好,實在看不懂就跳過,但是封裝以后的功能必須看懂。這是一個一般的加法過程涉及到的必要元素圖中已經…

設計模式實戰:自定義SpringIOC(親手實踐)

上一篇:設計模式實戰:自定義SpringIOC(理論分析) 自定義SpringIOC(親手實踐) 上一篇文章,我們介紹了SpringIOC容器的核心組件及其作用,下面我們來動手仿寫一個SpringIOC容器&#…

力扣面試150(42/150)

7.28 20. 有效的括號 給定一個只包括 (,),{,},[,] 的字符串 s ,判斷字符串是否有效。 有效字符串需滿足: 左括號必須用相同類型的右括號閉合。左括號必須以正確的順序閉合。每個右括號都有一…

基于黑馬教程——微服務架構解析(二):雪崩防護+分布式事務

之前的兩篇文章我們介紹了微服務的基礎概念及其服務間通信機制。本篇將深入探討微服務的核心保障:服務保護與分布式事務。一、微服務保護問題描述: 在一個購物車的微服務中,倘若某一項服務(服務A)同一時刻訪問的數據十…

LeetCode: 429 N叉樹的層序遍歷

題目描述給定一個 N 叉樹,返回其節點值的層序遍歷(即從左到右,逐層訪問每一層的所有節點)。示例輸入格式(層序序列化):輸入示意:1/ | \3 2 4/ \5 6輸出:[[1], [3,2,4…

使用phpstudy極簡快速安裝mysql

使用 phpStudy 極簡快速安裝 MySQL 的完整指南: 一、phpStudy 簡介 phpStudy 是一款 Windows 平臺下的 PHP 環境集成包,包含: Apache/Nginx PHP 5.x-7.x MySQL 5.5-8.0 phpMyAdmin 二、安裝步驟 1. 下載安裝包 訪問官網下載&#xf…

git lfs使用

apt install git lfs 或者下載二進制文件加到環境變量 https://github.com/git-lfs/git-lfs/releases git lfs install git lfs clone huggingface文件路徑 如果訪問不了hugggingface.co用hf-mirror.com替代,國內下載速度還是挺快的 先按照pip install modelscope m…

6、CentOS 9 安裝 Docker

🐳 CentOS 9 安裝 Docker 最全圖文教程(含鏡像源優化與常見問題解決)標簽:CentOS 9、Docker、容器技術、開發環境、國內鏡像源 適合讀者:后端開發、運維工程師、Linux 初學者📌 前言 在 CentOS 9 上安裝 Do…

SystemV消息隊列揭秘:原理與實戰

目錄 一、消息隊列的基本原理 1、基本概念 2、基本原理 3、消息類型的關鍵作用 4、重要特性總結 5、生命周期管理 6、典型應用場景 二、System V 消息隊列的內核數據結構 1、消息隊列的管理結構 msqid_ds(消息隊列標識符結構) 關鍵字段解析 2…

5 分鐘上手 Firecrawl

文章目錄Firecrawl 是什么?本地部署驗證mcp安裝palyground🔥 5 分鐘上手 FirecrawlFirecrawl 是什么? 一句話: 開源版的 “最強網頁爬蟲 清洗引擎” ? 自動把任意網頁 → 結構化 Markdown / JSON ? 支持遞歸整站抓取、JS 渲染…

算法訓練營day31 貪心算法⑤56. 合并區間、738.單調遞增的數字 、968.監控二叉樹

貪心算法的最后一篇博客!前面兩道題都是比較簡單的思路,重點理解一下最后一道題即可。有一說一,進入到貪心算法這一章節之后,我的博客里和代碼注釋里的內容明顯少了很多,因為很多貪心的題目我覺得不需要很復雜的文字說…

Jenkins流水線部署+webhook2.0

文章目錄1. 環境2. 用到的插件3. 流水線部署腳本1. 環境 Centos7Jenkins2.5.0JDKopen17阿里云倉庫 注意:這個版本兼容需要特別注意,要不然會很麻煩 2. 用到的插件 Generic Webhook Trigger 3. 流水線部署腳本 兼容鉤子部署(webhook&…

IDM下載失敗排查

網絡連接問題排查檢查網絡連接是否穩定,確保能夠正常訪問互聯網 測試其他下載工具或瀏覽器是否能夠正常下載 嘗試關閉防火墻或殺毒軟件,排除安全軟件攔截的可能性代理和VPN設置檢查確認IDM的代理設置是否正確,是否與系統代理一致 檢查是否使用…

Anaconda安裝時的幾個操作

一、安裝Anaconda 其實Anaconda的安裝比較簡單,點擊next就好了。在安裝中需要注意以下兩點: 1、選擇安裝路徑 在安裝時,路徑最好選擇非C盤,且路徑中不要出現中文,以免后期運行代碼時出現不必要的錯誤。 我安裝時&…

網易易盾、騰訊ACE等主流10款游戲反外掛系統對比

本文將深入對比10款游戲反外掛系統:1.網易易盾;2.Ricochet Anti?Cheat;3.BattlEye;4.幾維安全手游智能反外掛系統;5.伏魔AI反外掛;6.Riot Vanguard;7.Xigncode3;8.盛大GPK&#xff…

wpa_supplicant-2.10交叉編譯

參考文章:https://blog.csdn.net/weixin_45783574/article/details/145810790 1、Openssl交叉編譯 1.1 下載openssl-1.1.1t.tar.gz 下載網址: https://openssl-library.org/source/old/1.1.1/index.html1.2 編譯 sudo tar xvf openssl-1.1.1t.tar.gz cd openssl-1.1

源碼解讀SpringCloudAlibaba Nacos2.x

Nacos 服務注冊 Nacos 服務注冊時,客戶端會將自己的信息注冊到Nicosserver上,形成key-value組合,其中key通常是服務名稱,value是實例地址信息。在二點X版本中,客戶端通過Spring Boot的擴展機制(例如web_initialized事件…

Windows 11 下 Anaconda 命令修復指南及常見問題解決

Windows 11 下 Anaconda 命令修復指南及常見問題解決 在使用 Anaconda 過程中,可能會遇到環境損壞、更新失敗、包依賴沖突等問題。本文整理了一套通過命令行修復 Anaconda 的完整方案,適用于 Windows 11 系統,同時補充了權威參考鏈接供深入學…