黑马程序员技术交流社区

标题: SQL的union问题 [打印本页]

作者: 忘忧草    时间: 2012-4-16 09:16
标题: SQL的union问题
如下电话账单:

要求输出流水账单(含通话时长)+总市话+总长话

--通话流水账单
select [CallerNumber]
      ,[TelNum]
      ,datediff(second,[StartDateTime],[EndDateTime]) as '通话时间'
from [mydb2].[dbo].[T_CallRecords1]

没问题

--总长话
select '长话时长',sum(datediff(second,StartDateTime,EndDateTime)),''
from T_CallRecords1
where TelNum Like '0%'

没问题

--总市话
select '市话时长',sum(datediff(second,StartDateTime,EndDateTime)),''
from T_CallRecords1
where TelNum not Like '0%'

也没问题

把三项加起来
--通话流水账单
select [CallerNumber]
      ,[TelNum]
      ,datediff(second,[StartDateTime],[EndDateTime]) as '通话时间'
from [mydb2].[dbo].[T_CallRecords1]
union all
--总长话
select '长话时长',sum(datediff(second,StartDateTime,EndDateTime)),''
from T_CallRecords1
where TelNum Like '0%'
union all
--总市话
select '市话时长',sum(datediff(second,StartDateTime,EndDateTime)),''
from T_CallRecords1
where TelNum not Like '0%'

问题来了!怎么解决?

作者: 柏云杉    时间: 2012-4-16 09:46
本帖最后由 柏云杉 于 2012-4-16 09:47 编辑

第二行的那个varchar字段[TelNum]转换成int失败,因为超过了int的最大范围。
你得把其他两个select查询中的第二个字段手动转换成varchar就可以了,用convert(varchar,[字段])
作者: 骆崇飞    时间: 2012-4-16 09:49
首先你的语句

select '长话时长',sum(datediff(second,StartDateTime,EndDateTime)),''from T_CallRecords1
就出现了''空格,和

select [CallerNumber] ,[TelNum] ,datediff(second,[StartDateTime],[EndDateTime]) as '通话时间'
from [mydb2].[dbo].[T_CallRecords1]
的列对不上,当你补充后,你试着将你语句中获取的时长转换成字符串形式,如Convert(nvarcahar(50),sum(datediff(second,StartDateTime,EndDateTime))),CallerNumber也转换成字符串形式,Convert(nvarchar(50),CallerNumber),总之,要用到Union all时,每个列的数据类型及长度要一样!

作者: 徐瑞    时间: 2012-4-16 09:49
select [CallerNumber]
      ,[TelNum]
      ,datediff(second,[StartDateTime],[EndDateTime]) as '通话时间'
from [mydb2].[dbo].[T_CallRecords1]
union all
--总长话
select '长话时长',sum(datediff(second,StartDateTime,EndDateTime)),''
from T_CallRecords1
where TelNum Like '0%'
union all
--总市话
select '市话时长',sum(datediff(second,StartDateTime,EndDateTime)),''
from T_CallRecords1
where TelNum not Like '0%'


用 cast 或者 convert转换一下 sum(datediff(second,StartDateTime,EndDateTime)) 的数据类型,转换成varchar(50),

[TelNum]应为字符串类型,而与其对应的 sum(datediff(second,StartDateTime,EndDateTime))的为int类型,在转换int过程中[TelNum]的值超出了 int类型的数字上限.

本人也是刚学,如有说的不对的,请多多指教.
作者: 忘忧草    时间: 2012-4-16 09:49
谢谢 我是先自己写再看的视频,刚在视频上看到了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2