SQL Server常用语句

1. 修改某列的字符集

tinyint,int,double,decimal,datetime都不支持字符集变更

ALTER TABLE TableName ALTER COLUMN ColumnName [varchar](30) COLLATE Chinese_PRC_CS_AS  

2.不同字符集间比较

可以只在一列上使用Collate,保证和另一列的字符集一致 

Select * 
From TableA A,TableB B
Where A.No Collate Chinese_PRC_CS_AS = B.No Collate Chinese_PRC_CS_AS

 3.将多行的某列合并

表结构和数据如下 

Create Table #TempTable
(
Id int,
[Description] varchar(50)
)

Insert #TempTable(Id,Description)
Select 1,'1.1' Union All
Select 1,'1.2' Union All
Select 2,'2.1' Union All
Select 2,'2.2' Union All
Select 2,'2.3'

Select * From #TempTable

  3.1 输出结果

  

  3.2更新表

  

   3.3按组合并查询

   

SQL Stuff语法

STUFF ( character_expression , start , length ,character_expression )

以下示例在第一个字符串 abcdef 中删除从第 2 个位置(字符 b)开始的三个字符,然后在删除的起始位置插入第二个字符串,从而创建并返回一个字符串

SELECT STUFF('abcdef', 2, 3, 'ijklmn')
--运行结果
aijklmnef

SQL Coalesce语法

COALESCE ( expression [ ,...n ] )  返回其参数中第一个非空表达式。 

Select COALESCE(Null,100,Null,200)
--运行结果
100

 SQL For XML用法

 

4. 用一条SQL语句查询所有StandardCost都不小10的ProductID

Select Distinct ProductID From Production.ProductCostHistory
Where ProductID Not In 
(Select ProductID From Production.ProductCostHistory Where StandardCost < 10)
--Or
Select Distinct ProductID From Production.ProductCostHistory
Where ProductID Not In 
(Select ProductID Where StandardCost < 10)

5. 删除除了自动编号Id不一样的,所有其他信息都一样的纪录

 

Delete From TableName Where Id Not In
(Select Min(Id) From TableName Group By No,Name,CourseId,CourseName,Score)

6. 某表中只有字段Name,一共有4条纪录a,b,c,d,代表4个球队,没2个球队都要进行比赛。用一条SQL语句显示所有的比赛组合。

Select A.Name,B.Name From TableName A, TableName B Where A.Name < B.Name

7. 一百个账户各有100$,某个账户某天如有支出则添加一条新记录,记录其余额。一百天后,请输出每天所有账户的余额信息

  这个问题的难点在于每个用户在某天可能有多条纪录,也可能一条纪录也没有(不包括第一天)

  返回的记录集是一个100天*100个用户的纪录集

cAccount代表帐户,dDate代表日期,iCash代表余额

 思路:首先构建100天*100个帐号的纪录集,然后根据日期和帐号获取该帐号该日期的最小余额

Select A.dDate,B.cAccount,(Select Min(iCash) From T_Amount Where cAccount = B.cAccount And dDate <= A.dDate)
From
(Select Distinct dDate From T_Amount) A,
(Select Distinct cAccount From T_Amount) B
Order By A.dDate,B.cAccount

上面的代码还是有问题,如在某一天,所有帐号都没有消费纪录,则该天的纪录不会被统计出来,解决办法,通过其他方式获得日期集合,如假设这100天是由2016.01.01到2016.04.09

Select Dateadd(Day, number - 1, '2016-01-01') As dDate
From Master.dbo.spt_values
Where Type='P' and number <= datediff(day, '2016-01-01','2016-04-09') + 1
and number>0

合并后的代码为

Select A.dDate,B.cAccount,(Select Min(iCash) From T_Amount Where cAccount = B.cAccount And dDate <= A.dDate)
From
(
    Select Dateadd(Day, number - 1, '2016-01-01') As dDate
    From Master.dbo.spt_values
    Where Type='P' and number <= datediff(day, '2016-01-01','2016-04-09') + 1
    and number>0
) A,
(Select Distinct cAccount From T_Amount) B
Order By A.dDate,B.cAccount
原文地址:https://www.cnblogs.com/Niko12230/p/5604490.html