SQL Server 中master..spt_values的应用
今天在做数据分析报表的时候遇到一个这样的问题。
表结构如下。
部门编码、部门名称、部门人员ID(中间用逗号分割)
我想通过和人员表链接,查询出一个新的数据集,查询出的结果集格式如下:
人员信息(ID或者姓名)、部门编码、部门名称
以前都是通过程序遍历拆分表字段组成新的集合字段,然后在结合SQL语句查询出结果集,但是这个报表要求只能通过SQL语句实现,以前记得可以通过写字段分割函数再结合游标实现。然而今天在网上无意间找到一个新的方法。用“master..spt_values”来实现,具体实现方法见下面实例1感觉这个东西太好用了。把网上的实例都整理了一下,希望各路大神批评指教,也希望大家继续把这方面的应用贴上
select number from master..spt_values with(nolock) where type='P'
/**解释:master..spt_values表的字段值为P的对应number字段值是从0-2047*/--1.将字符串转换为列显示if object_id('tb') is not null drop table tb
go
create table tb([编号] varchar(3),[产品] varchar(2),[数量] int,[单价] int,[金额] int,[序列号] varchar(8))
insert into tb([编号],[产品],[数量],[单价],[金额],[序列号])
select '001','AA',3,5,15,'12,13,14' union all
select '002','BB',8,9,13,'22,23,24'
go
select [编号],[产品],[数量],[单价],[金额]
,substring([序列号],b.number,charindex(',',[序列号]+',',b.number)-b.number) as [序列号]
from tb a with(nolock),master..spt_values b with(nolock)
where b.number>=1 and b.number<len(a.[序列号]) and b.type='P'
and substring(','+[序列号],number,1)=','
go
drop table tb
go
/**
编号 产品 数量 单价 金额 序列号
---- ---- ----------- ----------- ----------- --------
001 AA 3 5 15 12
001 AA 3 5 15 13
001 AA 3 5 15 14
002 BB 8 9 13 22
002 BB 8 9 13 23
002 BB 8 9 13 24
*/
------------2.第四个逗号之前的字符串
declare @str varchar(100)
set @str='10,102,10254,103265,541,2154,41,156'
;with cte as(
select left(@str,number-1) as ss,row_number()over(order by getdate()) as xh
from master..spt_values with(nolock)
where number>=1 and number<=len(@str+',') and type='P'
and substring(@str+',',number,1)=','
)select ss from cte where xh=4
/**
ss
-------------------
10,102,10254,103265
*/
------------3.找出两句话中相同的汉字
declare @Lctext1 varchar(100)
declare @Lctext2 varchar(100)
set @Lctext1='我们都是来自五湖四海的朋友'
set @Lctext2='朋友多了路真的好走吗'
select substring(@Lctext2,number,1) as value
from master..spt_values with(nolock)
where type='P' and number>=1 and number<=len(@Lctext2)
and charindex(substring(@Lctext2,number,1),@Lctext1,number)>1
/**
value
-----
朋
友
的
*/
-----------4.提取两个日期之间的所有月份
if object_id('tb') is not null drop table tb
go
create table tb(id int identity(1,1),startDate varchar(10),endDate varchar(10))
insert into tb(startDate,endDate) select '2013-01-01','2013-09-25'
go
declare @startDate varchar(10)
declare @endDate varchar(10)
select @startDate=startDate,@endDate=endDate from tb with(nolock)
select convert(varchar(7),dateadd(mm,number,@startDate),120) as [月份]
from master..spt_values with(nolock)
where type='P' and number>=0
and dateadd(mm,number,@startDate)<=@endDate
go
drop table tb
go
/**
月份
-------
2013-01
2013-02
2013-03
2013-04
2013-05
2013-06
2013-07
2013-08
2013-09
*/
-----------5.求一个日期所在月份的所有日期
declare @date datetime
set @date='2013-08-31'
select convert(char(7),@date,120)+'-'+right('0'+convert(varchar(2),number),2) as [日期格式1]
,ltrim(year(@date))+right(100+month(@date),2)+right('0'+ltrim(number),2) as [日期格式2]
from master..spt_values with(nolock)
where type='P' and number>=1
--and number<=datediff(dd,@date,dateadd(mm,1,@date)) --对于mssql而言该语句不试用于2013-08-31的情况,这时由于9月没有31号,固计算出来的天数是30天
and number<=datediff(dd,convert(char(7),@date,120)+'-01',convert(char(7),dateadd(mm,1,@date),120)+'-01')--转换为1号来计算天数
/**
日期格式1 日期格式2
----------- --------------------
2013-08-01 20130801
2013-08-02 20130802
2013-08-03 20130803
2013-08-04 20130804
2013-08-05 20130805
2013-08-06 20130806
2013-08-07 20130807
2013-08-08 20130808
2013-08-09 20130809
2013-08-10 20130810
2013-08-11 20130811
2013-08-12 20130812
2013-08-13 20130813
2013-08-14 20130814
2013-08-15 20130815
2013-08-16 20130816
2013-08-17 20130817
2013-08-18 20130818
2013-08-19 20130819
2013-08-20 20130820
2013-08-21 20130821
2013-08-22 20130822
2013-08-23 20130823
2013-08-24 20130824
2013-08-25 20130825
2013-08-26 20130826
2013-08-27 20130827
2013-08-28 20130828
2013-08-29 20130829
2013-08-30 20130830
2013-08-31 20130831
*/
-----------6.根据给定时间为基准以2小时为划分,得出一天划分出的时间段
declare @time varchar(5)
set @time='11:13'
select ltrim(a.number)+right(@time,3)+'-'+ltrim(b.number)+right(@time,3) as [划分结果]
from master..spt_values a with(nolock),master..spt_values b with(nolock)
where a.type='P' and b.type='P'
and a.number>=left(@time,2) and b.number<=24
and a.number+2=b.number
/**
划分结果
-----------------------------------
11:13-13:13
12:13-14:13
13:13-15:13
14:13-16:13
15:13-17:13
16:13-18:13
17:13-19:13
18:13-20:13
19:13-21:13
20:13-22:13
21:13-23:13
22:13-24:13
*/
-----------7.将字符串显示为行列
if object_id('tb') is not null drop table tb
create table tb(id int identity(1,1),s nvarchar(100))
insert into tb(s) select '车位地址1,车位状况1|车位地址2,车位状况2|车位地址n,车位状况n'
;with cte as(
select substring(s,number,charindex('|',s+'|',number)-number) as ss
from tb with(nolock),master..spt_values with(nolock)
where type='P' and number>=1 and number<=len(s)
and substring('|'+s,number,1)='|'
)select left(ss,charindex(',',ss)-1)as s1,substring(ss,charindex(',',ss)+1,len(ss))as s2 from cte
drop table tb
/**
s1 s2
----------- ------------
车位地址1 车位状况1
车位地址2 车位状况2
车位地址n 车位状况n
*/
转载于:https://blog.51cto.com/kingrain/1554325
相关文章:

ora-1031解决一例
今天建立了一个测试环境,打算再次测试logical standby的建制。在建制物理standby时,发现archive log无法传递到standby,手工可以。察看log,发现如下错误: Errors in file c:\oracle\product\10.2.0\admin\it\bdump\it_arcp_2116.trc: ORA-010…

Revit:概念建模环境技能学习 Revit: Conceptual Modeling Environment
Revit:概念建模环境技能学习 Revit: Conceptual Modeling Environment MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz,2 Ch 云桥网络 平台huo取 教程 技能水平:高级|语言:英语中英文字幕(根据原英文字幕机译更准确&…

1 23 456c语言,2014年计算机二级考试C语言模拟题(1)
2014年计算机二级考试C语言模拟题(1)21.下列程序的运行结果为( )。#includemain(){struct date{int year,month,day;}today;printf("%d\n",sizeof(struct date));}A.8B.6C.10D.1222.有以下程序:#include<struct s…

屏蔽浏览器默认样式 user agent stylesheet
user agent stylesheet <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> table{border-collapse: collapse;border-spacing: 0;} 转载于:https://www.cnblogs.com/jxk…

Docker入门六部曲——服务
原文链接:http://www.dubby.cn/detail.html?id8735 准备 已经安装好Docker 1.13或者以上的版本。安装好Docker Compose。如果你是用的是Docker for Mac和Docker for Windows,那么不用担心,这是自带的。如果是Linux,那么需要你去…

AngularJs学习笔记--Forms
控件(input、select、textarea)是用户输入数据的一种方式。Form(表单)是这些控件的集合,目的是将相关的控件进行分组。 表单和控件提供了验证服务,所以用户可以收到无效输入的提示。这提供了更好的用户体验…

天秤座的爱情(转)
若不是秤子们爱上了爱情,或许,也就不用独自承受那么多。他们的爱情就像在上演的一部电影,他们就在这出戏里,眼看着它从开始到结束。落幕并不可怕,秤子们在乎的是他们成就了一部电影。 秤子们不喜欢落入俗套中的爱情。与…

虚幻引擎C++终极射手教程 Unreal Engine C++ The Ultimate Shooter Course
虚幻引擎C终极射手教程 Unreal Engine C The Ultimate Shooter Course MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz,2 Ch 语言:英语中英文字幕(根据原英文字幕机译更准确) |时长:55节课(8小时53分钟)|大小…
Nio得知3——该示范基地:多路复用器模式
Reactor模式和NIO 本文可以看作是Doug Lea Scalable IO in Java一文的翻译。当前分布式计算 Web Services盛行天下,这些网络服务的底层都离不开对socket的操作。他们都有一个共同的结构: 1. Read request 2. Decode request 3. Process service 4. Enco…

c语言随机数生成0 99函数,C语言生成随机数的函数、延时函数
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼下面C语言代码使用了生成随机数的函数、延时函数。请大家仔细观察其显示效果。从以下代码,我们可以得出一个重要的结论:当上述两类函数被放入循环时,应作出一定修改。同时还应关注其参数的定义位…

2022-2028年中国乙酸钴行业发展现状调研及市场前景规划报告
【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新(交付时间约3个工作日) 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国乙酸钴行业市场行业相关概述、中国乙酸钴行业市场行业运行环境、分析了中国乙酸钴行业市场…

MS UI Automation Introduction
MS UI Automation Introduction 2014-09-17 MS UI Automation是什么 UIA架构 UI自动化模型 UI自动化树概述 UI自动化控件模式概述 UI 自动化属性概述 UI 自动化事件概述 示例 使用UISpy工具 UI自动化提供者 常见问题分析解决 控件无法识别 Timing issue 本地化问题 自动化技术和…

spring+mybatis事务的readonly属性无效
在Spring配置事务中设置的read-only"true"不起作用,仍可以执行写操作;但是其他的正常。查看了一下DataSourceTransactionManager这个类的doBegin方法中没有判断read-only。HibernateTransactionManager.doBegain方法中则有一判断 if(!definiti…

ue5新手零基础学习教程 Unreal Engine 5 Beginner Tutorial - UE5 Starter Course
ue5新手零基础学习教程 Unreal Engine 5 Beginner Tutorial - UE5 Starter Course! 教程大小解压后:4.96G 语言:英语中英文字幕(机译)时长:4小时56分 1920X1080 mp4 虚幻引擎5新手教程!在这个教程中&…

C语言科学计算器思路,大神教你如何用C语言实现科学计算器
i;*leni;return temp;}/*功能:翻译操作数* 如果运算符非法,则返回0,合法则返回非零标志*/int translateopt(char *p,int *len){char fu[NUM_OPT][LEN_OPT]{"","-","*","/","^","(&qu…

BZOJ4292 : [PA2015]Równanie
注意到f(n)不会超过1459,于是暴力枚举f(n),检验nk*f(n)是否合法即可。 #include<cstdio> long long k,a,b,t;int i,j,ans; int main(){scanf("%lld%lld%lld",&k,&a,&b);for(i1;i<1459&&k<b/i;i){tk*i;if(a<…

Docker入门六部曲——Stack
原文链接:http://www.dubby.cn/detail.html?id8739 准备知识 安装Docker(版本最低1.13)。阅读完Docker入门六部曲——Swarm,并且完成其中介绍的内容。拷贝一份docker-compose.yml。确保你的虚拟机都是可用的,使用do…

SVD神秘值分解
SVD分解 SVD分解是LSA的数学基础,本文是我的LSA学习笔记的一部分,之所以单独拿出来,是由于SVD能够说是LSA的基础,要理解LSA必须了解SVD,因此将LSA笔记的SVD一节单独作为一篇文章。本节讨论SVD分解相关数学问题…

ebook download websites (to be continue...)
http://free-ebook-collection.blogspot.com/转载于:https://www.cnblogs.com/jerryhong/archive/2008/10/24/1318469.html

Blender模块化建筑环境地形场景制作视频教程 Creating modular environments
Blender模块化建筑环境地形场景制作视频教程 Creating modular environments Blender模块化建筑环境地形场景制作视频教程 Creating modular environments 流派:电子学习| MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz 语言:英语中英文字幕&…

文件系统演示C语言,基于C语言的简单文件系统的实现
1 题目介绍通过具体的文件存储空间的管理、文件物理结构、目录结构和文件操作的实现,加深对文件系统内部的数据结构、功能以及实现过程的理解。在内存中开辟一个虚拟磁盘空间作为文件存储分区,在其上实现一个简单的基于多级目录的单用户单任务系统中的文…

深度学习 vs 机器学习 vs 模式识别
http://www.csdn.net/article/2015-03-24/2824301 【编者按】本文来自CMU的博士,MIT的博士后,vision.ai的联合创始人Tomasz Malisiewicz的个人博客文章,阅读本文,你可以更好的理解计算机视觉是怎么一回事,同时对机器学…

2022-2028年中国乙丙橡胶行业市场全景调查及投资潜力研究报告
【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新(交付时间约3个工作日) 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国乙丙橡胶行业市场行业相关概述、中国乙丙橡胶行业市场行业运行环境、分析了中国乙丙橡胶行…

ubuntu 下利用ndiswrapper安装无线网卡驱动
本文转载自 http://kangxincai.is-programmer.com/posts/10488.html 首先 安装 ndiswrapperubuntu下也就是 ndisgtk (用于安装无线网卡驱动)sudo apt-get install ndisgtk安装好了之后,找到你的无线网卡在windows下的驱动文件(含有.inf的目录)(可以从网…

TSP问题——动态规划
Traveling Salesman Problem Description: Time Limit: 4sec Memory Limit:256MB 有编号1到N的N个城市,问从1号城市出发,遍历完所有的城市并最后停留在N号城市的最短路径长度。 Input:…

Blender从头到尾创建一辆宝马轿车视频教程
Blender从头到尾创建一辆宝马轿车视频教程 Blender: Create Realistic BMW 507 From Start to Finish 流派:电子学习| MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz 语言:英语中英文字幕(根据原英文字幕机译更准确)|大…

OC学习笔记之Foundation框架NSNumber、NSValue和NSDate(转)
一、NSNumber OC数组类NSArray,它只能存放 OC的对象,对于基本的数据类型确无能为力,但是实际编程中经常要把基本的数据如int、float,结构体存放的OC数组中,怎么办?这里的 NSNumber就有用了,它能…

android读取xml 字符串,Android 读取本地Xml文件,并转换成String
问题不是解析本地 xml 文件,而是要将 xml 文件中的所有内容(包含格式,标签等),直接转换成 String。与前端H5页面交互时, iOS 在请求远程 xml 文件耗时太长(有时需要4~5s),所以采用本地下载,然后传给前端的方…

Docker入门六部曲——容器
原文链接:http://www.dubby.cn/detail.html?id8734 准备 已经安装好Docker 1.13或者以上的版本。读完的上一篇文章(基本引导)。简单的测试一下你的本地环境是否已经OK了:docker run hello-world。 介绍 让我们开始构建一个Doc…

window.name实现的跨域数据传输
2019独角兽企业重金招聘Python工程师标准>>> 这篇文章是对 JavaScript跨域总结与解决办法 的补充。 有三个页面: a.com/app.html:应用页面。a.com/proxy.html:代理文件,一般是一个没有任何内容的html文件,需…