print @sql看看你连接后的语句是否正确...
解决方案 »
- provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接
- 请帮我规范一下一个存储过程语句好吗?
- 如何把一个数据库中的数据导如到另个数据库?
- 求一个SQL语句,请看表!!谢谢
- win 2003中安装SQL Server 2000 的问题!
- SQL如何缩小数据库的数据文件
- 如果几个表之间有主外键关系,查询时除了用join方法之外,还可以用什么方法查询?
- 写存储过程(判断时间,然后将符合数据的记录移动到另外一表中)
- 如何合并相同的数据,具体请看说明.谢谢.在线等
- 萌新为什么where语法执行会报错1064
- 安装了VS2005 怎么找不到SQLSERVER
- SQL2000和2005可以同时存在吗?
insert into tb values('张三' , '语文' , 74)
insert into tb values('张三' , '数学' , 83)
insert into tb values('张三' , '物理' , 93)
insert into tb values('李四' , '语文' , 74)
insert into tb values('李四' , '数学' , 84)
insert into tb values('李四' , '物理' , 94)
select UserName,sum(case when Subject= '数学' then Score else 0 end) [数学],sum(case when Subject= '物理' then Score else 0 end) [物理],sum(case when Subject= '语文' then Score else 0 end) [语文]
declare @sql varchar(1000)
set @sql='select UserName'
select @sql=@sql+',sum(case when Subject= ''' +Subject+ ''' then Score else 0 end) ['+Subject+']' from (select distinct Subject from tb)aset @sql = @sql + ' from tb group by UserName'
print @sql
exec(@sql)
--讲解:--这个是第一次执行
select 姓名,max(case 课程 when '数学' then 分数 else 0 end) [数学],
--这个是第二次
select 姓名,max(case 课程 when '数学' then 分数 else 0 end) [数学], max(case 课程 when '物理' then 分数 else 0 end) [物理] ,
--这个是第三次
select 姓名,max(case 课程 when '数学' then 分数 else 0 end) [数学], max(case 课程 when '物理' then 分数 else 0 end) [物理] , max(case 课程 when '语文' then 分数 else 0 end) [语文]
--这个的数量来自于
(select distinct 课程 from tb)--这里只有3们课程create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
gocreate function dbo.f_str(@id int) returns varchar(100)
as
begin
declare @str varchar(1000)
set @str = ''
select @str = @str + ',' + cast(value as varchar) from tb where id = @id
set @str = right(@str , len(@str) - 1)
return @str
end
go--调用函数
select id , value = dbo.f_str(id) from tb group by iddrop function dbo.f_str
drop table tb
我只说一个地方
select @str = @str + ',' + cast(value as varchar) from tb where id = @id
你把这个看懂就明白了
例如当@id=1
select @str = @str + ',' + cast(value as varchar) from tb where id = 1
把满足id=1的str值通过','累加
当id是动态的就是1或者2...是当满足1的查询完了,把值付给str之后
在查询满足2的直到所有的ID完为止
这样明白了吧
你的代码中貌似全是用的 join ,而没有见到 left join 啊...
@DyStartDate datetime = '2010-8-1',
@DyEndDate datetime = '2010-8-31'
AS
BEGIN
DECLARE @sql VARCHAR(4000)
SET @sql = 'SELECT a.pf, a.bf, a.pm'
SELECT @sql = @sql + ',SUM(CASE WHEN d.xm=''' + xm + ''' THEN sl ELSE NULL END) AS [' + xm + ']'
FROM (select xm from tqBuLiangXiangMu where xmlb = 5) t
SELECT @sql = @sql +
' FROM tpJiChuZiLiao a left join tpData c ON a.pf=c.pf left join tqBuLiangXiangMu d ON c.blxm = d.id
WHERE c.rq BETWEEN ''' + CONVERT(CHAR(10), @DyStartDate) + ''' AND ''' + CONVERT(CHAR(10), @DyEndDate)+ ''' AND c.bdid =5
GROUP BY a.pf,a.bf,a.pm'
EXEC (@sql)
END
试试看看先把语句PRINT出来,查询下,是否可以 。不行的话,就看看LEFT JION 的用法是