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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405812.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

缺少using namespace std;

错误现象&#xff1a; error C2143: syntax error : missing ; before < error C2501: list : missing storage-class or type specifiers error C2059: syntax error : < error C2039: iterator : is not a member of global namespace error C2238: unexpected token(s…

php json传输被过滤,php-the_content过滤器,用于将自定义字段添加到JSON响应

我对这个用于显示JSON API中的自定义字段的the_content过滤器感到绝望.我正在使用此插件http://wordpress.org/plugins/json-rest-api/从自定义帖子类型获得JSON响应.这些自定义帖子类型具有我必须在移动应用程序中显示的自定义字段.为了实现这一点,我编写了以下代码,该代码使用…

Ubuntu 和 Centos 的一点差别

1、 centos使用yum的方式&#xff0c;而Ubuntu使用apt-get 方式&#xff08;Raspberry也是&#xff09; 2、centos支持rpm包&#xff0c;但Ubuntu不支持 3、Ubuntu桌面系统比Centos好看&#xff0c;二者都有桌面系统和服务器系统 4、Ubuntu普通用户可以采用sudo执行root命令…

飞凌开发板 cramfs 镜像文件修改

From: http://blog.csdn.net/ex_net/article/details/7247111 CRAMFS文件系统是专门针对闪存设计的只读压缩的文件系统,其容量上限为256M,采用zlib压缩,文件系统类型可以是EXT2或EXT3.    如果使用RAMDISK方式来使用文件系统,那么在系统运行之后,首先得把flash上的映像文件全…

Linux下的signal信号机制

在Linux中&#xff0c;要发送一个信号相当容易。程序员需要知道两个信息&#xff1a;要发送哪个信号&#xff0c;将这个信号发送给哪个进程。可以用 man 7 signal 找到一个可以利用的信号的列表。用户可以只将信号发送给用户自己的进程&#xff0c;也可以以root身份运行从而将信…

React开发(200):三种截取字符串的方法

JS提供三个截取字符串的方法,分别是:slice(),substring()和substr(),它们都可以接受一个或两个参数: var stmp "rcinn.cn"; 使用一个参数 alert(stmp.slice(3));//从第4个字符开始,截取到最后个字符;返回"nn.cn" alert(stmp.substring(3));//从第4个字…

oracle scn与数据恢复,[Oracle] SCN与数据恢复的关系

Oracle内部主要存在以下四种SCN1.系统检查点(system checkpoint)SCN每当一个检查点完成时&#xff0c;Oracle就把该检查点对应的SCN记录到控制文件中&#xff0c;可以用以下语句查看当前数据库的检查点SCN&#xff1a;select CHECKPOINT_CHANGE# from v$database;CHECKPOINT_CH…

js Date 生成某年某月的天数

$(function () {//构造一个日期对象&#xff1a;var day new Date(2014, 2, 0);//获取天数&#xff1a;var daycount day.getDate();alert(daycount);}) 省去了判断 闰年平年 转载于:https://www.cnblogs.com/dragon-L/p/4522144.html

romfs, cramfs和ramdisk

From:http://blog.csdn.net/at91rm9200/article/details/550074 文章来源 &#xff08;http://publishblog.blogchina.com/blog/tb.b?diaryID3226065&#xff09; cramfs和romfs只是一个文件系统类型&#xff0c;ramdisk相当于一块硬盘空间&#xff0c;可以理解为在内存中虚拟…

Qt中利用QProcess调用外部cmd.exe执行程序

1、#include "mainwindow.h"中 添加头文件&#xff1a; #include <QProcess> 添加成员&#xff1a; QProcess *myprocess; 添加槽函数声明&#xff1a; void showCMDResult(); void showCMDState(QProcess::ProcessState state); void showCMDError(); vo…

html 后# 号的作用,及html 如何传参

2019独角兽企业重金招聘Python工程师标准>>> 经常在 网上看到一些静态网页后加着 #XXX 如http://www.family168.com/tutorial/springsecurity3/html/introduction.html#spring-security-core 这种形式。这个#spring-security-core 起的作用就是在 introduction 中定…

oracle10g生成awr报告,awr报告生成位置.docx

awr报告生成位置/u01/app/oracle/product//dbhome_1/rdbms/admin/脚本生成awr报告  在SQL环境执行&#xff1a;SQL>/u01/app/oracle/product//dbhome_1/rdbms/admin/  输入报告类型&#xff1a;html或text  输入要生成报告的天数&#xff0c;缺省是7天  列出最近7天…

Codeforces Round #304 (Div. 2)

这次打得较差&#xff0c;差点就绿了。。。 B题&#xff0c;这B题竟然WA了&#xff0c;再看看就发现一个很严重的错误。。--! #include <iostream> #include <cstdio> #include <algorithm> #include <cstring>using namespace std;int num[3050];int …

Qt 设置应用程序开机自启动

要实现开机自启动&#xff0c;主要是将应用程序添加到注册表中。 一、首先定义注册表 #define AUTO_RUN "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run" 二、编写开机自启动设置函数 //开机自启动&#xff0c;采用QSetting的方式将其写…

MySQL浅谈 LEFT JOIN

On条件&#xff08;在“A left join b on conditional_expr”&#xff09;决定如何从table B 中检索数据行&#xff08;Matching-State&#xff09;; 如果&#xff22;中没有行匹配On 条件&#xff0c;额外的B的所有数据列被设为null; 如果Matching-Stage阶段,where语句的任…

oracle cdc 关闭,Oracle CDC部署流程

一、ORACLE环境检查查oracle数据库版本(>9.2.0.4.0).select * from v$version;BANNEROracle Database 10g Enterprise Edition Release 10.2.0.1.0 - ProdPL/SQL Release 10.2.0.1.0 - ProductionCORE 10.2.0.1.0 ProductionTNS for 32-bit Windows: Version …

几个重要的RedHat Linux内核文件介绍 (1)

From:http://tech.sina.com.cn/s/s/2006-06-27/061923370.shtml Linux服务器内核编译基础 mynix编译自www.linux.org之Linux HowTo之Kernel HowTo 在网络中&#xff0c;不少服务器采用的是Linux系统。为了进一步提高服务器的性能&#xff0c;可能需要根据特定的硬件及需求重新…