zoukankan      html  css  js  c++  java
  • sql 行转 列, 列转行

    
    
    行列互转
    
    
    复制代码
    
    create table test(id int,name varchar(20),quarter int,profile int) 
    insert into test values(1,'a',1,1000)
    insert into test values(1,'a',2,2000)
    insert into test values(1,'a',3,4000)
    insert into test values(1,'a',4,5000)
    insert into test values(2,'b',1,3000)
    insert into test values(2,'b',2,3500)
    insert into test values(2,'b',3,4200)
    insert into test values(2,'b',4,5500)
    select * from test
    
    --行转列
    select id,name,
    [1] as "一季度",
    [2] as "二季度",
    [3] as "三季度",
    [4] as "四季度",
    [5] as "5"
    from
    test
    pivot
    (
    sum(profile)
    for quarter in
    ([1],[2],[3],[4],[5])
    )
    as pvt
    
    
    create table test2(id int,name varchar(20), Q1 int, Q2 int, Q3 int, Q4 int)
    insert into test2 values(1,'a',1000,2000,4000,5000)
    insert into test2 values(2,'b',3000,3500,4200,5500)
    select * from test2
    
    --列转行
    select id,name,quarter,profile
    from
    test2
    unpivot
    (
    profile
    for quarter in
    ([Q1],[Q2],[Q3],[Q4])
    ) 
    as unpvt
    
    复制代码
    
     
    
    sql替换字符串 substring replace
    
    
    
    复制代码
    
    --例子1:
    update tbPersonalInfo set TrueName = replace(TrueName,substring(TrueName,2,4),'**') where ID = 1
    
    --例子2:
    update tbPersonalInfo set Mobile = replace(Mobile,substring(Mobile,4,11),'********') where ID = 1
    
    --例子3:
    update tbPersonalInfo set Email = replace(Email,'chinamobile','******') where ID = 1 
    
    复制代码
    
     
    
    SQL查询一个表内相同纪录 having
    
    如果一个ID可以区分的话,可以这么写
    
    
    select * fromwhere ID in (
    select ID from 表 group by ID having sum(1)>1)
    如果几个ID才能区分的话,可以这么写
    
    
    select * fromwhere ID1+ID2+ID3 in
    (select ID1+ID2+ID3 from 表 group by ID1,ID2,ID3 having sum(1)>1)
    其他回答:数据表是zy_bho,想找出ZYH字段名相同的记录
    
    
    复制代码
    
    --方法1:    
    SELECT  *FROM  zy_bho  a  WHERE  EXISTS 
      (SELECT  1  FROM  zy_bho  WHERE  [PK]  <>  a.[PK]  AND  ZYH  =  a.ZYH) 
       
    --方法2:
    select  a.*  from  zy_bho  a  join  zy_bho  b 
          on  (a.[pk]<>b.[pk]  and  a.zyh=b.zyh) 
       
    --方法3:
    select  *  from  zy_bbo  where  zyh  in 
    (select  zyh  from  zy_bbo  group  by  zyh  having  count(zyh)>1) 
    --其中pk是主键或是 unique的字段。 
    
    复制代码
    
    把多行SQL数据变成一条多列数据,即新增列
    
    
    
    复制代码
    
    Select
    DeptName=O.OUName,
    '9G'=Sum(Case When PersonalGrade=9 Then 1 Else 0 End),
    '8G'=Sum(Case When PersonalGrade=8 Then 1 Else 0 End),
    '7G4'=Sum(Case When PersonalGrade=7 AND JobGrade =4 Then 1 Else 0 End),
    '7G3'=Sum(Case When PersonalGrade=7 AND JobGrade =3 Then 1 Else 0 End),
    '6G'=Sum(Case When PersonalGrade=6 Then 1 Else 0 End),
    '5G3'=Sum(Case When PersonalGrade=5 AND JobGrade =3 Then 1 Else 0 End),
    '5G2'=Sum(Case When PersonalGrade=5 AND JobGrade =2 Then 1 Else 0 End),
    '4G'=Sum(Case When PersonalGrade=4 Then 1 Else 0 End),
    '3G2'=Sum(Case When PersonalGrade=3 AND JobGrade =2 Then 1 Else 0 End),
    '3G1'=Sum(Case When PersonalGrade=3 AND JobGrade =1 Then 1 Else 0 End),
    '2G'=Sum(Case When PersonalGrade=2 Then 1 Else 0 End),
    '1G'=Sum(Case When PersonalGrade=1 Then 1 Else 0 End),
    --' 未定级'=Sum(Case When PersonalGrade=NULL Then 1 Else 0 End) 
    
    复制代码
    
     
    
    表复制
    
    
    insert into PhoneChange_Num ([IMSI],Num)
    SELECT [IMSI]
          ,count([IMEI]) as num
      FROM [Test].[dbo].[PhoneChange] group by [IMSI] order by num desc 
    
    语法1:Insert INTO table(field1,field2,...) values(value1,value2,...)
    
    语法2:Insert into Table2(field1,field2,...) select value1,value2,... from Table1(要求目标表Table2必须存在,由于目标表Table2已经存在,所以我们除了插入源表Table1的字段外,还可以插入常量。)
    
    语法3:SELECT vale1, value2 into Table2 from Table1(要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中。)
    
    语法4:使用导入导出功能进行全表复制。如果是使用【编写查询以指定要传输的数据】,那么在大数据表的复制就会有问题?因为复制到一定程度就不再动了,内存爆了?它也没有写入到表中。而使用上面3种语法直接执行是会马上刷新到数据库表中的,你刷新一下mdf文件就知道了。 
    
     
    
    利用带关联子查询Update语句更新数据
    
    
    复制代码
    
    --方法1:
    Update Table1 set c = (select c from Table2 where a = Table1.a) where c is null 
    
    --方法2:
    update  A
    set  newqiantity=B.qiantity
    from  A,B
    where  A.bnum=B.bnum 
    
    --方法3:
    update
        (select A.bnum ,A.newqiantity,B.qiantity from A left join B on A.bnum=B.bnum) AS C
    set C.newqiantity = C.qiantity
    where C.bnum =XX 
    
    复制代码
    
     
    
    连接远程服务器
    
    
    --方法1:
    select *  from openrowset('SQLOLEDB','server=192.168.0.67;uid=sa;pwd=password','SELECT * FROM BCM2.dbo.tbAppl')
    
    --方法2:
    select *  from openrowset('SQLOLEDB','192.168.0.67';'sa';'password','SELECT * FROM BCM2.dbo.tbAppl')  

    --判断某些字段是否为空
    --case
    select case when '字段名' is null then 'N' else convert(varchar(20),'字段名'end as 'NewName'
    select case when null is null then 'N' else convert(varchar(20),nullend as 'NewName'

    --SQL Server 2005:coalesce
    select coalesce('字符串类型字段','N'as 'NewName'
    select coalesce(convert(varchar(20),'非字符串类型字段'),'N'as 'NewName'
    select coalesce(convert(varchar(20),null),'N'as 'NewName'

    --coalesce,返回其参数中的第一个非空表达式
    select Coalesce(null,null,1,2,null)union
    select Coalesce(null,11,12,13,null)union
    select Coalesce(111,112,113,114,null)



    newid()的妙用

    
    
    生成测试数据
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    CREATE TABLE [dbo].[test](
        [name] [varchar](20) NULL,
        [quarter] [int] NULL,
        [profile] [int] NULL,
        [dates] [smallint] NULL,
        [ID] [int] IDENTITY(1,1) NOT NULL,
     CONSTRAINT [PK_test] PRIMARY KEY CLUSTERED
    (
        [ID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    SET ANSI_PADDING OFF
    GO
    SET IDENTITY_INSERT [dbo].[test] ON
    INSERT [dbo].[test] ([name], [quarter], [profile], [dates], [ID]) VALUES (N'a', 1, 1000, 421, 1)
    INSERT [dbo].[test] ([name], [quarter], [profile], [dates], [ID]) VALUES (N'Aa', 2, 2000, 421, 2)
    INSERT [dbo].[test] ([name], [quarter], [profile], [dates], [ID]) VALUES (N'AA', 3, 4000, 421, 3)
    INSERT [dbo].[test] ([name], [quarter], [profile], [dates], [ID]) VALUES (N'a', 4, 5000, 421, 4)
    INSERT [dbo].[test] ([name], [quarter], [profile], [dates], [ID]) VALUES (N'b', 1, 3000, 421, 5)
    INSERT [dbo].[test] ([name], [quarter], [profile], [dates], [ID]) VALUES (N'b', 2, 3500, 421, 6)
    INSERT [dbo].[test] ([name], [quarter], [profile], [dates], [ID]) VALUES (N'b', 3, 4200, 421, 7)
    INSERT [dbo].[test] ([name], [quarter], [profile], [dates], [ID]) VALUES (N'b', 4, 5500, 421, 8)
    INSERT [dbo].[test] ([name], [quarter], [profile], [dates], [ID]) VALUES (N'a', 1, 1000, 421, 9)
    SET IDENTITY_INSERT [dbo].[test] OFF
    
    

     --从数据库中随机取出N条记录的方法:newid()

    
    
    select top 5 * from test select top 5 * from test order by newid()
    
    
  • 相关阅读:
    快速获取JOB运行结果
    快速获取DB服务器当前 MEM CPU的资源消耗
    Mongodb Sharding+Replica Set
    MongoDB replSet
    Journal工作原理
    Oracle索引梳理系列(八)- 索引扫描类型及分析(高效索引必备知识)
    Oracle索引梳理系列(七)- Oracle唯一索引、普通索引及约束的关系
    Oracle索引梳理系列(六)- Oracle索引种类之函数索引
    Oracle索引梳理系列(五)- Oracle索引种类之表簇索引(cluster index)
    Oracle索引梳理系列(四)- Oracle索引种类之位图索引
  • 原文地址:https://www.cnblogs.com/yangpeng-jingjing/p/4710937.html
Copyright © 2011-2022 走看看