当前位置: 代码迷 >> Sql Server >> 这个二简单表合并查询的SQL写法。
  详细解决方案

这个二简单表合并查询的SQL写法。

热度:141   发布时间:2016-04-24 08:45:30.0
这个2简单表合并查询的SQL写法。。。
请教大家 这个查询SQL如何写

我有2个表,第一个表基础信息表,info

id    name(姓名)    age(年龄)
1     张三    18
2     李四    20
3     王五    19

第二表是记录系统登录时间表  signtime
 id     mid     dtime(登录时间)
  1      1        2015-01-10
  2      3        2015 -02 -11
  3      2        2015 -03 -09
  4      1        2015-01-12 
  5      1        2015-04-05

想要得到这样的结果集
id    姓名    年龄  一月登录次数  二月登录次数   三月登录次数 四登录次数  。。。。。十二月登录次数
1    张三      18               2                                                                           1
2    李四      20                                                                    1
3    王五      19                                          1

可根据年条件得不同 得到不同年的结果集
------解决思路----------------------

CREATE TABLE #signtime(  
     mid int  
    ,  dtime varchar(100)  
)   
INSERT INTO #signtime  
SELECT 1,'2015-01-10'  
UNION  
SELECT 3,'2015-02-11'   
UNION  
SELECT 2,'2015-03-09'   
UNION  
SELECT 1,'2015-01-12'   
UNION  
SELECT 1,'2015-04-05'  

CREATE TABLE #info(  
     id int  
    ,  name varchar(10) 
    ,  age int
)   
INSERT INTO #info  
SELECT 1,'张三',18
UNION  
SELECT 2,'李四',20   
UNION  
SELECT 3,'王五' ,19  
 
 
    
--select * from #signtime   
declare @sql varchar(max)  
set @sql=''  
select @sql=@sql + ',['+rtrim(left(dtime,7))+']=sum(case left(dtime,7) when '''+rtrim(left(dtime,7))+''' then 1 else 0 end)'  
from #signtime group by left(dtime,7) 
   
exec('select b.id,b.name, b.age'+@sql+'from  #signtime a,#info b
where a.mid=b.id group by  b.id,b.name, b.age' )  
DROP TABLE #signtime
DROP TABLE #info

/*
(5 行受影响)

(3 行受影响)
id          name       age         2015-01     2015-02     2015-03     2015-04
----------- ---------- ----------- ----------- ----------- ----------- -----------
1           张三         18          2           0           0           1
2           李四         20          0           0           1           0
3           王五         19          0           1           0           0

(3 行受影响)
*/



declare @sql varchar(max)  
set @sql=''  
select @sql=@sql + ',['+rtrim(left(dtime,7))+']=sum(case left(dtime,7) when '''+rtrim(left(dtime,7))+''' then 1 else 0 end)'  
from #signtime group by left(dtime,7) 
   
exec('select b.id,b.name, b.age'+@sql+'from  #signtime a,#info b
where a.mid=b.id group by  b.id,b.name, b.age' )  
这些是主要代码,您把我的临时表的#去掉,就是您的真实表。
  相关解决方案