日期:2014-05-18  浏览次数:20419 次

一个单子段查询返回为列表的问题。我又来sql版了,这次乖乖的100分放上。各位达人来解决问题吧。
首先我需要查询的字段是这种形式的表:
datime val1 val2 val3
20120521 521日值1 521日值2 521日值3
20120522 522日值1 522日值2 522日值3
20120523 523日值1 523日值2 523日值3
20120524 524日值1 524日值2 524日值3
20120525 525日值1 525日值2 525日值3
20120622 622日值1 622日值2 622日值3
20120623 623日值1 623日值2 623日值3
20120624 624日值1 624日值2 624日值3
20120525 625日值1 625日值2 625日值3 

我希望查询单子段后按照月份和日期形成新的表格并返回表格,返回后需求是能在c#里面填充到dataset。

预期查询表格:
年月 21日 22日 23日 24日 25日
201205 521值1 522值1 523值1 524值1 525值1
201206 空 622值1 623值1 624值1 625值1
 
值2、值3等为同样的查询,有值1的查询后我自己可以参考制作。

求各位大大给个方法或语句,在这里拜谢各位了。
如果是其他的处理方法只要有方法查询效率也比较高一样给非结贴,我结贴率100%,除了这个帖子还没结贴。有满意必结贴。

------解决方案--------------------
http://topic.csdn.net/u/20080614/17/22e73f33-f071-46dc-b9bf-321204b1656f.html
------解决方案--------------------
只取值1吗?
SQL code
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([datime] varchar(10),[val1] varchar(8),[val2] varchar(8),[val3] varchar(8))
insert [tb]
select '20120521','521日值1','521日值2','521日值3' union all
select '20120522','522日值1','522日值2','522日值3' union all
select '20120523','523日值1','523日值2','523日值3' union all
select '20120524','524日值1','524日值2','524日值3' union all
select '20120525','525日值1','525日值2','525日值3' union all
select '20120622','622日值1','622日值2','622日值3' union all
select '20120623','623日值1','623日值2','623日值3' union all
select '20120624','624日值1','624日值2','624日值3' union all
select '20120525','625日值1','625日值2','625日值3'
go

declare @sql varchar(8000)
select 
  @sql=isnull(@sql+',','')
  +'max(case when right([datime],2)='''+dd+''' then val1 end) as ['+dd+'日]'
from
(select distinct right([datime],2) dd from tb) t

exec ('select left(datime,6) as 年月,'+@sql+' from tb group by left(datime,6)')

/**
年月         21日      22日      23日      24日      25日
---------- -------- -------- -------- -------- --------
201205     521日值1   522日值1   523日值1   524日值1   625日值1
201206     NULL     622日值1   623日值1   624日值1   NULL

(2 行受影响)
**/

------解决方案--------------------
SQL code

-->TravyLee生成测试数据:[test]
if object_id('[test]') is not null 
drop table [test]
create table [test](
[datime] datetime,
[val1] varchar(8),
[val2] varchar(8),
[val3] varchar(8)
)
go
insert [test]
select '20120521','521日值1','521日值2','521日值3' union all
select '20120522','522日值1','522日值2','522日值3' union all
select '20120523','523日值1','523日值2','523日值3' union all
select '20120524','524日值1','524日值2','524日值3' union all
select '20120525','525日值1','525日值2','525日值3' union all
select '20120622','622日值1','622日值2','622日值3' union all
select '20120623','623日值1','623日值2','623日值3' union all
select '20120624','624日值1','624日值2','624日值3' union all
select '20120525','625日值1','625日值2','625日值3'
go
select CONVERT(varchar(6),[datime],112) as [datime] from test

--写个存储过程:
if OBJECT_ID('pro_test') is not null
drop proc pro_test
go
create proc pro_test
(
@Date datetime
)
as
declare @str varchar(max)
set @str=''
select 
    @str=@str+',['+ltrim(DATEPART(DD,[datime]))+'日]=max(case when DATEPART(DD,[datime])='
    +LTRIM(DATEPART(DD,[datime]))+' then [val1] else '''' end)'
from 
    test 
where 
    [datime]<=@Date
group by
    DATEPART(DD,[datime])
set @str='select convert(varchar(6),[datime],112) as [datime]'
         +@str+' from test group by convert(varchar(6),[datime],112)'
exec(@str)
go


exec pro_test '20120525'
go
/*
datime    21日    22日    23日    24日    25日
------------------------------------------------
201205    521日值1    522日值1    523日值1    524日值1    625日值1
201206        622日值1    623日值1    624日值1    
*/