SQL 常用语句 Case When select into from 和 insert into select 插入临时表

Case when 的用法: 一旦满足了某一个WHEN, 则这一条数据就会退出CASE WHEN , 而不再考虑 其他CASE;

Case when 的用法

-- 搜索Case函数:

Case函数(Case搜索函数): 判断表达式的真假,如果为真,返回结果;如果为假,返回else值;如果未定义else值,则返回空值(使用条件确定返回值);

select name,id,(case when id=34 then salary*2

when id=45 then salary*3

else salary

end) new_salary

from semp;

-- 简单Case函数

简单Case表达式的作用是: 使用表达式确定返回值:

select id,name,(case sex

when '1' then '男'

when '2' then '女'

else '其他' end)

from student;

这两种方法可以实现相同的功能. 简单Case函数的写法比较简单,但是和case搜索函数相比,功能方面会有些限制,比如判断式.

还有一个需要注意的问题,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略.

比如下面 SQL,将无法得到第二个结果:(差永远获取不到)

sql如下

case when colum in ('a', 'b') then '优秀'

when colum in ('a') then '差'

else '其他' end

 

Case when  LIKE 的用法

 

CASE
WHEN TargetName LIKE '%均值%' THEN
TargetAvg
WHEN TargetName LIKE '%累计%' THEN
TargetValue
WHEN TargetName LIKE '%标偏%' THEN
TargetRet
ELSE
TargetValue
END AS Value,

 

 

使用 case when进行行列转换

固定列数的行列转换
如表结构为:

Name subject score
---------------------------
张三 语文 80
张三 数学 70
张三 英语 60
李四 语文 90
李四 数学 80
李四 英语 100
....
转换为 :
语文 数学 英语
张三 80 70 60
李四 90 80 100
要求:创建表,源表,表名: Stu , 只用一句sql 得到转换结果。
解答:
方法一 :通过生成临时表的方式操作
select name ,sum(yw) as '语文',sum(sx) as '数学',sum(wy) as '英语'
from(
select name ,
CASE subject WHEN '语文' THEN score END AS yw,
CASE subject WHEN '数学' THEN score END AS sx,
CASE subject WHEN '英语' THEN score END AS wy
from Stu
) tempStu
group by name
方法二:课程只有语文、数学、物理这三门课程则可以使用静态sql 来实现 Sql2000
select name as 姓名,
max(case subject when '语文' then score else 0 end) 语文,
max(case subject when '数学' then score else 0 end) 数学,
max(case subject when '英语' then score else 0 end) 英语
from Stu
group by name
方法三:如果课程不止语文、数学、物理这三门课程 则可以使用动态sql 来实现
创建一个用户变量,使用简单的T-SQL来实现。 Sql2000
declare @sql varchar(8000) --声明一个变量
set @sql = 'select name as 姓名'
select @sql = @sql + ' , max(case subject when ''' + subject+ ''' then score else 0 end) [' + subject+ ']'
from (select distinct subject from Stu) as a
set @sql = @sql + ' from Stu group by name'
print @sql --打印生成的sql
exec(@sql) --执行该sql
注: case when的作用就是一个条件选择语句,根据不同的要求显示不同的内容,格式是这样的case
when [选择条件]
then [结果1]
else [结果2]
end
其中[选择条件]也可以放在case之后。
CASE WHEN语句在DB2,ORACLE,SQL SERVER系列,SYBASE等大型数据库都受到支持,是标准的SQL语句.

 

 

自己用到的sql

 

if OBJECT_ID('tempdb..#temp') is not null
drop table #temp
select * into #temp from 
(
   
 

SELECT MESOrderID,
       TargetName,
       CASE
           WHEN TargetName LIKE '%均值%' THEN
               TargetAvg
           WHEN TargetName LIKE '%累计%' THEN
               TargetValue
           WHEN TargetName LIKE '%标偏%' THEN
               TargetRet
           ELSE
               TargetValue
       END AS value,
       TargetUnit,
       CheckResult
FROM dbo.EProductProgressTarget
WHERE MESOrderID IN
      (
          SELECT MESOrderID
          FROM dbo.EWorkOrder
          WHERE ClassShiftID IS NOT NULL
                AND SourceCode = 'ApplyMES'
                AND WorkstageCode = 'MTA5'
                AND CreateTime > '2021-12-01 00:38:57.2559147'
      )
      AND
      (
          TargetCode IN ( '6072.6072.MTA5_SJ2344_AFeedAccTotal', '6072.6072.MTA5_SJ2344_AddFeedTotal',
                          '6072.6072.MTA5_SJ2344_InFlowTotal'
                        )
          OR ParmCode IN ( 'MTA5229', 'MTA5227', 'MTA5230', 'MTA5231', 'MTA5228' )
      )
      AND ProgressType = 'End'
 
 
) as A

 SELECT * FROM #temp

declare @sql varchar(4000)  
set @sql = 'select mesorderid'  
  
select @sql = @sql + ',max(case targetname when '''+targetname+''' then  value end) ['+targetname+']'  
from (select distinct targetname from #temp  ) as a  
order by targetname  
   
select @sql = @sql+' from #temp  group by mesorderid'  
  
--print @sql  
 

exec(@sql) 

  


 

sql插入临时表数据的方法

方法有两种,主要看需求。

方法1:定义好临时表的字段和类型、插入对应的值

create table #Tmp --创建临时表#Tmp
(
    City   varchar(50),  --
    Country  varchar(50),   --
);

insert #Tmp
select '北京','中国' union
select '东京','日本' union
select '纽约','美国' 

select * from #Tmp;

方法2:直接将查询出来的表数据插入临时表中

if OBJECT_ID('tempdb..#temp') is not null
drop table #temp
select * into #temp from 
(
    --select * from Activity
    select 7 as 'month',25 as 'day'
    union all
    select 7 as 'month',25 as 'day'
    union all
    select 8 as 'month',25 as 'day' 
    union all
    select 8 as 'month',25 as 'day'
    union all
    select 8 as 'month',25 as 'day'
 
) as A


select *  from #temp

 

 

select into from 和 insert into select 的用法和区别

 

select into from 和 insert into select都是用来复制表,两者的主要区别为: select into from 要求目标表不存在,因为在插入时会自动创建。insert into select from 要求目标表存在
 
下面分别介绍两者语法
 
一、INSERT INTO SELECT语句
 
1、语句形式为:

Insert into Table2(field1,field2,...) select value1,value2,... from Table1
 
2、注意地方:
 
(1)要求目标表Table2必须存在,并且字段field,field2...也必须存在
 
(2)注意Table2的主键约束,如果Table2有主键而且不为空,则 field1, field2...中必须包括主键
 
(3)注意语法,不要加values,和插入一条数据的sql混了,不要写成:
  Insert into Table2(field1,field2,...) values (select value1,value2,... from Table1)
 
(4)由于目标表Table2已经存在,所以我们除了插入源表Table1的字段外,还可以插入常量。
 
3、完整实例:
 --1.创建测试表
    create TABLE Table1
    (
         a varchar(10),
         b varchar(10),
         c varchar(10),
         CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED
         (
             a ASC
         )
    ) ON [PRIMARY]
 
    create TABLE Table2
    (
         a varchar(10),
         c varchar(10),
         d int,
         CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED
         (
             a ASC
         )
    ) ON [PRIMARY]
    GO
 
 
    --2.创建测试数据
    Insert into Table1 values('赵','asds','90')
    Insert into Table1 values('钱','asds','100')
    Insert into Table1 values('孙','asds','80')
    Insert into Table1 values('李','asds',null)
    GO
    select * from Table2
 
 
    --3.INSERT INTO SELECT语句复制表数据
    Insert into Table2(a, c, d) select a,c,5 from Table1
    GO
 
 
    --4.显示更新后的结果
    select * from Table2
    GO
 
 
    --5.删除测试表
    drop TABLE Table1
    drop TABLE Table2
二、SELECT INTO FROM语句

语句形式为:
SELECT vale1, value2 into Table2 from Table1
要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中 。 
完整实例:
--1.创建测试表
     create TABLE Table1
    (
         a varchar(10),
         b varchar(10),
         c varchar(10),
         CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED
         (
             a ASC
         )
    ) ON [PRIMARY]
    GO
 
 
    --2.创建测试数据
     Insert into Table1 values('赵','asds','90')
    Insert into Table1 values('钱','asds','100')
    Insert into Table1 values('孙','asds','80')
    Insert into Table1 values('李','asds',null)
    GO
 
 
    --3.SELECT INTO FROM语句创建表Table2并复制数据
     select a,c INTO Table2 from Table1
    GO
 
 
    --4.显示更新后的结果
     select * from Table2
    GO
 
 
    --5.删除测试表
     drop TABLE Table1
    drop TABLE Table2

posted @ 2022-07-08 10:36  王晓升  阅读(1307)  评论(0编辑  收藏  举报
/* 播放器 */