1、查询的时候把某一个字段的值拼接成字符串

以下是演示数据。

第一种方式:使用自定义变量

DECLARE @Names NVARCHAR(128)SET @Names=''    -- 需要先赋值为空字符串,不然结果会是 null SELECT @Names=@Names+S_Name+','        -- S_Name 类型为字符串类型,如果不能隐示转换,就需要强制转换
FROM StudentSELECT @Names

这种方法有一个好处就是,拼接出来的字符串可以赋值给变量或直接插入表中指定字段,可以适用于存储过程之类的。

第二种方式:转换为 XML 格式

SELECT t.S_Name + ','
FROM
(SELECT S_Name FROM Student
) t
FOR XML PATH('')

使用这种方式有一个缺点就是,不能直接赋值给变量或插入表,适用于查看时使用。

如果想要使之能够赋值给变量或插入表中,那就需要转换一下。如下:

DECLARE @Names NVARCHAR(128)SET @Names=''SELECT @Names=
(SELECT t.S_Name + ',' FROM (SELECT S_Name FROM Student ) t FOR XML PATH(''),TYPE
).value('.','NVARCHAR(128)')SELECT @Names 

2、查询一个字段同时满足多个条件的方法

举个栗子:比如现在有一些订单,而每一个订单有多个产品,现在我要查出同时具有某几个产品的订单。

再拿学生和课程来举例,一个学生可以选择多门课程,而每一门课程也可以同时被多个学生所选择,那么我现在要查出选择了某几门课程的学生。

下面是演示数据。

现在我要查出同时选择了 C# 和 SQL 课程的学生信息。如下:

  SELECT s.S_Id,s.S_No,s.S_Name FROM Student s INNER JOIN Student_Course_Relation r ON s.S_Id=r.S_IdINNER JOIN Course c ON r.C_Id=c.C_IdWHERE c.C_Name='C#' OR c.C_Name='SQL' GROUP BY s.S_Id,s.S_No,s.S_Name HAVING COUNT(1) >= '2'            -- 这个数字是根据 where 条件来定

3、SQL Server 实现多行转列

之前也写过一篇博客,SQL Server 使用 Pivot 和 UnPivot 实现行列转换,但是之前都是相对于“单列”的转换,于是最近碰到一个需要两列的问题。最后在网上找了一些相关资料,得出了下面的解决方法。下面先建立一个表,插入一些模拟的数据。如下:

create table OrderDemo
(ID        int        not null identity(1,1) primary key,CustomerCode    nvarchar(16)    not null,OrderCount    int        not null default(0),TotalAmount  decimal(13,3)    not null default(0),YearDate    nvarchar(8)        null,MonthDate    nvarchar(8)        null
)insert into OrderDemo
(CustomerCode,OrderCount,TotalAmount,YearDate,MonthDate
)
select 'A001','23','28.650','2017','1' union all
select 'A001','67','123.123','2017','2' union all
select 'A002','12','28.320','2017','1' union all
select 'A002','37','51.221','2017','2' union all
select 'A003','89','452.200','2017','1' union all
select 'A003','134','523.210','2017','2' union all
select 'A004','78','230.220','2017','1' union all
select 'A004','95','180.567','2017','2' union all
select 'A005','128','230.789','2017','1' union all
select 'A005','256','340.450','2017','2' select * from OrderDemo 

以上的数据是模拟的按客户、订单年份和订单月份统计的订单数量和金额,由于年月的时间段非固定的,所以这里使用的是动态sql,下面直接上代码:

declare @strSql nvarchar(1024)
declare @strWhere nvarchar(1024)set @strWhere=''-- 用作转换之后的列头
select @strWhere = @strWhere+TitleCount+','+TitleAmount+','
from
(select distinct '['+YearDate+'年'+MonthDate+'月'+'数量'+']' TitleCount,'['+YearDate+'年'+MonthDate+'月'+'金额'+']' TitleAmountfrom OrderDemo
) t -- 去掉最后一个逗号
if(CHARINDEX(',',REVERSE(@strWhere))=1)
beginset @strWhere=SUBSTRING(@strWhere,1,len(@strWhere)-1)
endset @strSql='select * from (select CustomerCode,ComDate+ColumnName ComDate,CountAndAmount from  (select CustomerCode,YearDate+''年''+MonthDate+''月'' ComDate,cast(OrderCount as nvarchar) ''数量'',cast(TotalAmount as nvarchar) ''金额'' from OrderDemo ) a UNPIVOT (CountAndAmount for ColumnNameIN ([数量],[金额])) b ) c pivot(max(CountAndAmount) for ComDate in ('+ @strWhere +')) d 'exec (@strSql) 

结果如下:

既然两列可以这么实现,那么如果在多一列呢,或者多很多列。这里我稍稍修改了一下,多增加了一列进行测试(多列同理),修改之后的代码如下:

create table OrderDemo
(ID        int        not null identity(1,1) primary key,CustomerCode    nvarchar(16)    not null,OrderCount    int        not null default(0),ProductCount int  not null default(0),TotalAmount  decimal(13,3)    not null default(0),YearDate    nvarchar(8)        null,MonthDate    nvarchar(8)        null
)insert into OrderDemo
(CustomerCode,OrderCount,ProductCount,TotalAmount,YearDate,MonthDate
)
select 'A001','23','35','28.650','2017','1' union all
select 'A001','67','75','123.123','2017','2' union all
select 'A002','12','18','28.320','2017','1' union all
select 'A002','37','42','51.221','2017','2' union all
select 'A003','89','98','452.200','2017','1' union all
select 'A003','134','150','523.210','2017','2' union all
select 'A004','78','99','230.220','2017','1' union all
select 'A004','95','102','180.567','2017','2' union all
select 'A005','128','138','230.789','2017','1' union all
select 'A005','256','280','340.450','2017','2' select * from OrderDemo declare @strSql nvarchar(1024)
declare @strWhere nvarchar(1024)set @strWhere=''-- 用作转换之后的列头
select @strWhere = @strWhere+TitleCount+','+TitleAmount+','+TitleProduct+','
from
(select distinct '['+YearDate+'年'+MonthDate+'月'+'数量'+']' TitleCount,'['+YearDate+'年'+MonthDate+'月'+'金额'+']' TitleAmount,'['+YearDate+'年'+MonthDate+'月'+'产品数量'+']' TitleProduct from OrderDemo
) t -- 去掉最后一个逗号
if(CHARINDEX(',',REVERSE(@strWhere))=1)
beginset @strWhere=SUBSTRING(@strWhere,1,len(@strWhere)-1)
endset @strSql='select * from (select CustomerCode,ComDate+ColumnName ComDate,CountAndAmount from  (select CustomerCode,YearDate+''年''+MonthDate+''月'' ComDate,cast(OrderCount as nvarchar) ''数量'',cast(TotalAmount as nvarchar) ''金额'',cast(ProductCount as nvarchar) ''产品数量'' from OrderDemo ) a UNPIVOT (CountAndAmount for ColumnNameIN ([数量],[金额],[产品数量])) b ) c pivot(max(CountAndAmount) for ComDate in ('+ @strWhere +')) d 'exec (@strSql) 

PS:需要注意的是当需要转换的列的数据类型不同时需要转换为同一种类型,比如这里的 “数量、金额、产品数量”。

4、在子查询中使用 Order By

比如,我现在有这样一些数据。如下:

我现在想要使用子查询按字段 “Stu_Age” 排序,那么就有了如下代码:

可以看见这样是有错误的,那么下面有两种解决办法。

第一种: row_number() over() 排名开窗函数

  select * from (select [StudentID],Stu_FullName,Stu_Age,Stu_Address,Stu_Phone,ROW_NUMBER() over(order by Stu_Age) RowNumfrom Student ) t 

第二种:TOP 100 PERCENT,英语比较好的朋友就知道 percent 就是百分比的意思,结果显而易见。top 100 percent 就表示百分之百,即全部的数据。

  select * from (select top 100 percent [StudentID],Stu_FullName,Stu_Age,Stu_Address,Stu_Phone from Student order by Stu_Age ) t 

其实我个人的话还是喜欢第一种方式,第二种也是偶尔看到的。

5、删除所有字段都相同的重复的数据

首先创建一个临时表并插入一些数据,用于模拟该场景。

create table #temp
(ID int not null,Name varchar(20) null
)insert into #temp(ID,Name) values('1','测试');
insert into #temp(ID,Name) values('1','测试');
insert into #temp(ID,Name) values('2','测试');select * from #temp

类似于上面这种数据,第一条和第二条数据明显属于完成重复,故需要删除其中一条。

刚开始第一时间想到的方式是,把两条数据全部删除,然后再插入一条。

后来又想到了下面这种方式,个人觉得还不错。

with tes as
(select ID,Name,row_number() over(partition by ID,Name order by ID) RowNum from #temp
)
delete from tes where RowNum > 1select * from #temp

到此结束,最后再删除临时表。

drop table #temp

转载于:https://www.cnblogs.com/Brambling/p/7083689.html

SQL Server 一些使用小技巧相关推荐

  1. SQL Server实用操作小技巧集合

    包括安装时提示有挂起的操作.收缩数据库.压缩数据库.转移数据库给新用户以已存在用户权限.检查备份集.修复数据库等 (一)挂起操作 在安装Sql或sp补丁的时候系统提示之前有挂起的安装操作,要求重启,这 ...

  2. Sql Server实用操作小技巧总结(转)

    包括安装时提示有挂起的操作.收缩数据库.压缩数据库.转移数据库给新用户以已存在用户权限.检查备份集.修复数据库等. (一)挂起操作 在安装Sql或sp补丁的时候系统提示之前有挂起的安装操作,要求重启, ...

  3. Sql Server实用操作小技巧集合(转)

    包括安装时提示有挂起的操作.收缩数据库.压缩数据库.转移数据库给新用户以已存在用户权限.检查备份集.修复数据库等   (一)挂起操作 在安装Sql或sp补丁的时候系统提示之前有挂起的安装操作,要求重启 ...

  4. SQL Server中的小技巧(重复、替换、截取、去空格、去小数点后的位数)

    PS:随笔写的在SQL Server中要用到的 (重复.替换.截取.去空格.去小数点后的位数) /*---------------------------重复--------------------- ...

  5. sql server 之函数小技巧 整数类型为空是用空字符串替代实现

    1.判空函数 说明:使用指定的替换值替换 NULL. 语法:ISNULL ( check_expression , replacement_value ) 参数: check_expression:将 ...

  6. SQL Server编写存储过程小工具(三)

    SQL Server编写存储过程小工具  功能:为给定表创建Update存储过程  语法: sp_GenUpdate <Table Name>,<Primary Key>,&l ...

  7. SQL Server最受欢迎技巧:解读DBA

    http://tech.it168.com/a2010/0105/832/000000832829_all.shtml [IT168 技术分析]在向2009年告别之际,我们来回顾一下过去的一年中最受欢 ...

  8. SQL Server 2008索引使用技巧

    微软MVP及畅销书<Hitchhiker's Guide SQL Server>的作者Bill Vaughn简要给出了SQL Server 2008的索引使用技巧.该主题基于Kimberl ...

  9. sql查询复习笔记-小技巧,大智慧(续一)

    3.回答有关"至少"的问题 前言:"至多"的对立面是"至少".通常,采用"至多"问题中表述的技巧变体,就可以解决&quo ...

最新文章

  1. 为什么抢红包抢不过别人?学了这个算法就明白了!
  2. 高效工作,分享几个实用的小诀窍,很多人已经悄悄用上了
  3. Java实用教程笔记 常用实用类
  4. 转在同一个sql语句中如何写不同条件的count数量
  5. iOS中判断程序是不是第一次运行(新手引导界面用)
  6. angularjs定义对集合进行过滤的过滤器
  7. 投资级别(Investment Grade)
  8. PYPL 二月榜单发布:最受欢迎的编程语言、IDE 和数据库都是哪些
  9. css 竖行进度图_css实现横向与竖向进度条效果的方法
  10. java 数组中某个数出现的概率_剑指Offer解题报告(Java版)——排序数组中某个数的个数 38...
  11. asp.net core 使用 AccessControlHelper 控制访问权限
  12. c json输出html标签,Json编码HTML字符串
  13. 特斯拉造人、小鹏骑马、小米遛狗,准车企们为何集体盯上了机器人生意?
  14. 2019年第二届全国大学生大数据技能竞赛通知
  15. wince开发环境搭建与全套教程
  16. Maven-01-私服搭建及使用
  17. 拓端tecdat|Matlab正态分布、历史模拟法、加权移动平均线 EWMA估计风险价值VaR和回测Backtest标准普尔指数 SP500时间序列
  18. 荣耀V8鸿蒙系统刷机包,华为荣耀V8原版rom系统刷机包_荣耀V8最新版升级包更新下载...
  19. MTK平台sip信令的查看和volte的故障
  20. 思科VPLS解决方案

热门文章

  1. git或者ssh出错 fatal:open /dev/null or dup failed: No such file or directory、弹出mitty.dump文件
  2. MarkdownPad2 免费升级pro版本
  3. JAVA通过JDBC连接并操作MySQL数据库
  4. 解决ExcelReport导出Excel报Number of rules must not exceed 3错误的问题
  5. 前四次作业--个人总结
  6. 使用DBNEWID Utility 修改oracle数据库的 db name 和 dbid
  7. 数据结构5: 链表(单链表)的基本操作及C语言实现
  8. Vue.js之UI组件elementUI——MintUI
  9. DataTable排序,检索,合并,筛选
  10. 基于Visual C++2010与windows SDK fo windows7开发Windows 7的多点触摸特性应用程序(1)