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