SQL逗号分隔的字段统计(摘自网络)
生活随笔
收集整理的這篇文章主要介紹了
SQL逗号分隔的字段统计(摘自网络)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
前言: 由于很多業(yè)務(wù)表因?yàn)闅v史原因或者性能原因,都使用了違反第一范式的設(shè)計(jì)模式。即同一個(gè)列中存儲(chǔ)了多個(gè)屬性值(具體結(jié)構(gòu)見下表)。 這種模式下,應(yīng)用常常需要將這個(gè)列依據(jù)分隔符進(jìn)行分割,并得到列轉(zhuǎn)行的結(jié)果。 表數(shù)據(jù): ID Value 1 tiny,small,big 2 small,medium 3 tiny,big 期望得到結(jié)果: 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'); #用于循環(huán)的自增表 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; 原理分析: 這個(gè)join最基本原理是笛卡爾積。通過這個(gè)方式來實(shí)現(xiàn)循環(huán)。 以下是具體問題分析: length(a.Size) - length(replace(a.mSize,',',''))+1 ?表示了,按照逗號(hào)分割后,改列擁有的數(shù)值數(shù)量,下面簡稱n join過程的偽代碼: 根據(jù)ID進(jìn)行循環(huán) { 判斷:i 是否 <= n { 獲取最靠近第 i 個(gè)逗號(hào)之前的數(shù)據(jù), 即 substring_index(substring_index(a.mSize,',',b.ID),',',-1) i = i +1? } ID = ID +1? } ?www.2cto.com ? 總結(jié): 這種方法的缺點(diǎn)在于,我們需要一個(gè)擁有連續(xù)數(shù)列的獨(dú)立表(這里是incre_table)。并且連續(xù)數(shù)列的最大值一定要大于符合分割的值的個(gè)數(shù)。 例如有一行的mSize 有100個(gè)逗號(hào)分割的值,那么我們的incre_table 就需要有至少100個(gè)連續(xù)行。 當(dāng)然,mysql內(nèi)部也有現(xiàn)成的連續(xù)數(shù)列表可用。如mysql.help_topic: help_topic_id 共有504個(gè)數(shù)值,一般能滿足于大部分需求了。 改寫后如下: 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; ========================================================================= 問題: 有個(gè)表中的一個(gè)字段Author,如下
ID Author
1 張三
2 張三,李四
3 王五
4 李四
5 張三,李四,王五
現(xiàn)在想查詢出這樣的結(jié)果
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 那個(gè)100你就替換個(gè)稍微大點(diǎn)的數(shù)吧
ID Author
1 張三
2 張三,李四
3 王五
4 李四
5 張三,李四,王五
現(xiàn)在想查詢出這樣的結(jié)果
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 那個(gè)100你就替換個(gè)稍微大點(diǎn)的數(shù)吧
轉(zhuǎn)載于:https://www.cnblogs.com/buzi521/p/4519005.html
總結(jié)
以上是生活随笔為你收集整理的SQL逗号分隔的字段统计(摘自网络)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LINUX - /etc/init.d/
- 下一篇: Servlet生命周期中的service