当前位置: 代码迷 >> Sql Server >> 求一条SQL语句,两张表得到结果表,该怎么解决
  详细解决方案

求一条SQL语句,两张表得到结果表,该怎么解决

热度:11   发布时间:2016-04-24 09:23:30.0
求一条SQL语句,两张表得到结果表
表1
费用 天数
100 15
200 12
50 8
100 3
600 2
----------------
表2
天数 起止
3 1-3
7 4-7
10 8-10
20 11-20
30 21-30
-----------------
结果
1-3 4-7 8-10 11-20 21-30
700 0 50 300 0

注,结果表中的字段为表2的行[起止]字段,费用在此起止内如没有则为0.,表2的行可能会变
------解决思路----------------------
DECLARE @SQL VARCHAR(8000)--如果觉得长度不够,改为MAX,不过MAXSQL2000不支持
SET @SQL=''
SELECT @SQL=@SQL+',ISNULL(SUM(CASE WHEN 天数>='+SUBSTRING(起止,1,CHARINDEX('-',起止)-1)+' AND 天数<='
+SUBSTRING(起止,CHARINDEX('-',起止)+1,LEN(起止))+' THEN 费用 END),0)['+起止+']'
FROM 表2
SET @SQL='SELECT '+STUFF(@SQL,1,1,'')+'FROM 表1'
PRINT @SQL
EXEC(@SQL)

------解决思路----------------------
use master
go
if OBJECT_ID('a') is not null drop table a
go
if OBJECT_ID('b') is not null drop table b
go
create table a(费用 int, 天数 int)
create table b(天数 int,起止 varchar(20))
go
insert into a 
             select 100,15 union all
             select 200,12 union all
             select 50,8 union all
             select 100,3 union all
             select 600,2
go
insert into b
             select 3,'1-3' union all
             select 7,'4-7' union all
             select 10,'8-10' union all
             select 20,'11-20' union all
             select 30,'21-30'
go
declare @i varchar(8000)
set @i=''

select @i=@i+ ',sum(case when 天数 between '+LEFT(起止,charindex('-',起止)-1)+' and '+
SUBSTRING(起止,CHARINDEX('-',起止)+1,9)+' then 费用 else 0 end) as ['+起止+']'
from b

set @i='select '+stuff(@i,1,1,'')

select @i=@i+'from a'

exec(@i)

/*
1-3 4-7 8-10 11-20 21-30
--------------------------
700  0  50   300 0
--------------------------
*/
  相关解决方案