• 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
  • 相关阅读:
    组装query,query汇总,query字段
    POJ 1276, Cash Machine
    POJ 1129, Channel Allocation
    POJ 2531, Network Saboteur
    POJ 1837, Balance
    POJ 3278, Catch That Cow
    POJ 2676, Sudoku
    POJ 3126, Prime Path
    POJ 3414, Pots
    POJ 1426, Find The Multiple
  • 原文地址:https://www.cnblogs.com/Niko12230/p/5604490.html
Copyright © 2020-2023  润新知