日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL逗号分隔的字段统计(摘自网络)

發布時間:2023/12/9 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL逗号分隔的字段统计(摘自网络) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言: 由于很多業務表因為歷史原因或者性能原因,都使用了違反第一范式的設計模式。即同一個列中存儲了多個屬性值(具體結構見下表)。 這種模式下,應用常常需要將這個列依據分隔符進行分割,并得到列轉行的結果。 表數據: ID  Value 1 tiny,small,big 2 small,medium 3 tiny,big 期望得到結果: ID Value 1 tiny 1 small 1 big 2 small 2 medium 3 tiny 3 big 正文: www.2cto.com ? #需要處理的表 create table tbl_name (ID int ,mSize varchar(100)); insert into tbl_name values (1,'tiny,small,big'); insert into tbl_name values (2,'small,medium'); insert into tbl_name values (3,'tiny,big'); #用于循環的自增表 create table incre_table (AutoIncreID int); insert into incre_table values (1); insert into incre_table values (2); insert into incre_table values (3); select a.ID,substring_index(substring_index(a.mSize,',',b.AutoIncreID),',',-1)? from? tbl_name a join incre_table b on b.AutoIncreID <= (length(a.mSize) - length(replace(a.mSize,',',''))+1) order by a.ID; 原理分析: 這個join最基本原理是笛卡爾積。通過這個方式來實現循環。 以下是具體問題分析: length(a.Size) - length(replace(a.mSize,',',''))+1 ?表示了,按照逗號分割后,改列擁有的數值數量,下面簡稱n join過程的偽代碼: 根據ID進行循環 { 判斷:i 是否 <= n { 獲取最靠近第 i 個逗號之前的數據, 即 substring_index(substring_index(a.mSize,',',b.ID),',',-1) i = i +1? } ID = ID +1? } ?www.2cto.com ? 總結: 這種方法的缺點在于,我們需要一個擁有連續數列的獨立表(這里是incre_table)。并且連續數列的最大值一定要大于符合分割的值的個數。 例如有一行的mSize 有100個逗號分割的值,那么我們的incre_table 就需要有至少100個連續行。 當然,mysql內部也有現成的連續數列表可用。如mysql.help_topic: help_topic_id 共有504個數值,一般能滿足于大部分需求了。 改寫后如下: select a.ID,substring_index(substring_index(a.mSize,',',b.help_topic_id+1),',',-1)? from? tbl_name a join mysql.help_topic b on b.help_topic_id < (length(a.mSize) - length(replace(a.mSize,',',''))+1) order by a.ID; ========================================================================= 問題: 有個表中的一個字段Author,如下
ID Author
1 張三
2 張三,李四
3 王五
4 李四
5 張三,李四,王五

現在想查詢出這樣的結果
Author Count
張三 3
李四 3
王五 2


sql server 解答: if object_id('Tempdb..#Num') is not null
drop table #Num
select top 100 ID=Identity(int,1,1) into #Num from syscolumns a,syscolumns b
Select
Author=substring(a.Author,b.ID,charindex(',',a.Author+',',b.ID)-b.ID),count(*)
from
table1 a,#Num b
where
charindex(',',','+a.Author,b.ID)=b.ID
group by substring(a.Author,b.ID,charindex(',',a.Author+',',b.ID)-b.ID);

table1替換成你自己表名,top 100 那個100你就替換個稍微大點的數吧

轉載于:https://www.cnblogs.com/buzi521/p/4519005.html

總結

以上是生活随笔為你收集整理的SQL逗号分隔的字段统计(摘自网络)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。