這種要用交叉表查詢
給你參考一個例子:create table AccountMessage(FFundCode varchar(6),FAccName varchar(8),FAccNum int)
Insert into AccountMessage 
select '000001','北京存款','1'
union all select '000001','上海存款','2'
union all select '000001','深圳存款','3'
union all select '000002','北京存款','1'
union all select '000002','上海存款','2'
union all select '000002','天津存款','3'
union all select '000003','上海存款','1'
union all select '000003','福州存款','2'select * from AccountMessagecreate table AccountBalance(FDate datetime,FFundCode varchar(6),FAccNum int , FBal numeric(12,2))
Insert into AccountBalance 
select '2004-07-28','000001','1','1000.00'
union all select '2004-07-28','000001','2','1000.00'
union all select '2004-07-28','000001','3','1120.00'
union all select '2004-07-28','000002','1','2000.00'
union all select '2004-07-28','000002','2','1000.00'
union all select '2004-07-28','000002','3','1000.00'
union all select '2004-07-28','000003','1','2000.00'
union all select '2004-07-28','000003','2','1000.00'
union all select '2004-07-28','000003','2','1000.00'select * from AccountBalancedeclare @sql varchar(8000)
set @sql=''
select @sql=@sql+',['+a.FAccName+']=SUM(CASE a.FAccName WHEN '''+a.FAccName+''' THEN  b.FBal ELSE 0 END)'
from AccountMessage a
left join AccountBalance b on a.FFundCode=b.FFundCode
group by a.FAccName
print @sqlexec('SELECT 基金代碼=a.FFundCode'+@sql+' FROM AccountMessage a LEFT JOIN AccountBalance b ON a.FFundCode=b.FFundCode AND  a.FAccNum=b.FAccNum GROUP BY  a.FFundCode')--結果
基金代码 上海存款 天津存款 北京存款 深圳存款 福州存款
000001 1000.00 .00 1000.00 1120.00 .00
000002 1000.00 1000.00 2000.00 .00 .00
000003 2000.00 .00 .00 .00 1000.00

解决方案 »

  1.   

    CREATE TABLE #TMP([name] VARCHAR(20),
    JAN INT,FEB INT,MAR INT ,APR INT ,MAY INT ,JUN INT ,JUL INT ,AUG INT ,SEP INT ,OCT INT ,NOV INT ,[DEC] INT )
    SELECT shopname,MONTH(regdate),SUM(1) as MEM_NUM FROM member GROUP BY shopname,MONTH(regdate)
    insert into #TMP([name]) select name from shopUPDATE #TMP set JAN=a.MEM_NUM from (SELECT shopname,MONTH(regdate) as REG_MON,SUM(1) as MEM_NUM FROM member GROUP BY shopname,MONTH(regdate)) A WHERE A.REG_MON=1 AND #TMP.[NAME]=A.[shopname]
    UPDATE #TMP set FEB=a.MEM_NUM from (SELECT shopname,MONTH(regdate) as REG_MON,SUM(1) as MEM_NUM FROM member GROUP BY shopname,MONTH(regdate)) A WHERE A.REG_MON=2 AND #TMP.[NAME]=A.[shopname]
    UPDATE #TMP set MAR=a.MEM_NUM from (SELECT shopname,MONTH(regdate) as REG_MON,SUM(1) as MEM_NUM FROM member GROUP BY shopname,MONTH(regdate)) A WHERE A.REG_MON=3 AND #TMP.[NAME]=A.[shopname]
    UPDATE #TMP set APR=a.MEM_NUM from (SELECT shopname,MONTH(regdate) as REG_MON,SUM(1) as MEM_NUM FROM member GROUP BY shopname,MONTH(regdate)) A WHERE A.REG_MON=4 AND #TMP.[NAME]=A.[shopname]
    UPDATE #TMP set MAY=a.MEM_NUM from (SELECT shopname,MONTH(regdate) as REG_MON,SUM(1) as MEM_NUM FROM member GROUP BY shopname,MONTH(regdate)) A WHERE A.REG_MON=5 AND #TMP.[NAME]=A.[shopname]
    UPDATE #TMP set JUN=a.MEM_NUM from (SELECT shopname,MONTH(regdate) as REG_MON,SUM(1) as MEM_NUM FROM member GROUP BY shopname,MONTH(regdate)) A WHERE A.REG_MON=6 AND #TMP.[NAME]=A.[shopname]
    UPDATE #TMP set JUL=a.MEM_NUM from (SELECT shopname,MONTH(regdate) as REG_MON,SUM(1) as MEM_NUM FROM member GROUP BY shopname,MONTH(regdate)) A WHERE A.REG_MON=7 AND #TMP.[NAME]=A.[shopname]
    UPDATE #TMP set AUG=a.MEM_NUM from (SELECT shopname,MONTH(regdate) as REG_MON,SUM(1) as MEM_NUM FROM member GROUP BY shopname,MONTH(regdate)) A WHERE A.REG_MON=8 AND #TMP.[NAME]=A.[shopname]
    UPDATE #TMP set SEP=a.MEM_NUM from (SELECT shopname,MONTH(regdate) as REG_MON,SUM(1) as MEM_NUM FROM member GROUP BY shopname,MONTH(regdate)) A WHERE A.REG_MON=9 AND #TMP.[NAME]=A.[shopname]
    UPDATE #TMP set OCT=a.MEM_NUM from (SELECT shopname,MONTH(regdate) as REG_MON,SUM(1) as MEM_NUM FROM member GROUP BY shopname,MONTH(regdate)) A WHERE A.REG_MON=10 AND #TMP.[NAME]=A.[shopname]
    UPDATE #TMP set NOV=a.MEM_NUM from (SELECT shopname,MONTH(regdate) as REG_MON,SUM(1) as MEM_NUM FROM member GROUP BY shopname,MONTH(regdate)) A WHERE A.REG_MON=11 AND #TMP.[NAME]=A.[shopname]
    UPDATE #TMP set [DEC]=a.MEM_NUM from (SELECT shopname,MONTH(regdate) as REG_MON,SUM(1) as MEM_NUM FROM member GROUP BY shopname,MONTH(regdate)) A WHERE A.REG_MON=12 AND #TMP.[NAME]=A.[shopname]
    select * from #TMP order by 1
      

  2.   

    --可以这样试试
    select [name]
    ,一月=sum(case datepart(month,regdate) when 1 then 1 else 0 end) 
    ,二月=sum(case datepart(month,regdate) when 2 then 1 else 0 end)
    ...........
    from shop s
    left join member m
      on m.regdate between '年初' and '年末'