zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    04.设备
    03.抖音课程大纲2
    02.抖音课程大纲
    01 抖音直播现状
    1.14常见的5种字符编码特征
    1.13BeautifulSoup 剔除 HTML script 脚本;删除指定 class标签
    Ng Alain使用
    MediatR
    RN错误随笔
    1.RN环境搭建,创建项目,使用夜神模拟调试
  • 原文地址:https://www.cnblogs.com/Niko12230/p/5604490.html
Copyright © 2011-2022 走看看