问一个查询结果动态生成列的问题

沉默的羔羊 2011-11-19 04:56:55
现在碰到一个问题,如下:
入库表中,id为零部件的编号,内容举例
id shuliang date
1 400 2011-1-1
1 500 2011-1-1
1 200 2011-1-4
2 100 2011-1-5





希望可以通过SQL语句查询结果为

列名:id 2011-1-1 2011-1-4 2011-1-5 。。。(根据入库表中的时间再自动增加)
1 900 200 null
2 null null 100

可以实现么?
请赐教,谢谢!
...全文
191 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
沉默的羔羊 2011-11-21
  • 打赏
  • 举报
回复
自己顶一下。。。
沉默的羔羊 2011-11-20
  • 打赏
  • 举报
回复
用您最早不带SUM的,我已经在使用了。用ASP.NET调用存储过程,直接GRIDVIEW可以输出,虽然不能设定行的具体式样。
沉默的羔羊 2011-11-20
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 roy_88 的回复:]

SQL code
这样?


declare @s nvarchar(1000)
set @s='select
b.bupinlistid,b.bupinmingcheng,b.bupinfanhao,a.shuliang,a.[date]
from bupin as a
right join bupinlist as b on a.bupinlistid = b.bupinlistid……
[/Quote]

试过了。。。还是只有SUM,没有明细了。我不能发图片,不然就发链接上来了。SQL2008+VS2010。
中国风 2011-11-20
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 harlow1999 的回复:]

如果不用sum,用您前面的语句OK,没有任何问题。
[/Quote]

对,改为存储过程,把程序传的语句作为参数
沉默的羔羊 2011-11-20
  • 打赏
  • 举报
回复
如果不用sum,用您前面的语句OK,没有任何问题。
中国风 2011-11-20
  • 打赏
  • 举报
回复
这样?


declare @s nvarchar(1000)
set @s='select
b.bupinlistid,b.bupinmingcheng,b.bupinfanhao,a.shuliang,a.[date]
from bupin as a
right join bupinlist as b on a.bupinlistid = b.bupinlistid and MONTH(a.date) = 9 where b.dalei = ''HTHT''
'

--上面是程序传参


--以下是存储过程调用



set @s=STUFF(@s,CHARINDEX('from',@s),0,' into #T ')



exec(
@s+'
declare @s nvarchar(4000)
set @s=''''
Select @s=@s+N'',''+quotename(CONVERT(varchar(10),Date,120))+N''=sum(case when CONVERT(varchar(10),Date,120)=N''+quotename(CONVERT(varchar(10),Date,120),'''''''')+N'' then shuliang end)''

from #T group by date

exec(N''select bupinlistid''+@s+N'',sum([shuliang]) as 合计 from #T group by bupinlistid'')
')
中国风 2011-11-20
  • 打赏
  • 举报
回复
改为存储过程调用,全用字符串执行
沉默的羔羊 2011-11-20
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 roy_88 的回复:]

引用 14 楼 harlow1999 的回复:

结果是:
ID 合计
1053 75000
1054 25000
1055 60000
(下略)

参照12楼,有测试的结果
[/Quote]

先谢过!

的确,结果如帖子所写,

但是,换我自己的数据,就有问题了,因为是要根据前端的变量输入,语句如下:

select b.bupinlistid,b.bupinmingcheng,b.bupinfanhao,a.shuliang,a.[date] from bupin as a right join bupinlist as b on a.bupinlistid = b.bupinlistid and MONTH(a.date) = 9 where b.dalei = 'HTHT'

[bupinmingcheng]和[bupinfanhao]都是nvarchar(50)
中国风 2011-11-20
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 harlow1999 的回复:]

结果是:
ID 合计
1053 75000
1054 25000
1055 60000
(下略)
[/Quote]
参照12楼,有测试的结果
沉默的羔羊 2011-11-20
  • 打赏
  • 举报
回复
如果不最后用SUM,是可以没问题得出结果的。。。
沉默的羔羊 2011-11-20
  • 打赏
  • 举报
回复
结果是:
ID 合计
1053 75000
1054 25000
1055 60000
(下略)
沉默的羔羊 2011-11-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 roy_88 的回复:]

引用 11 楼 harlow1999 的回复:

追问:
用各位的语句都可以达到效果,也让我对SQL的强大再次羡慕。
那里可以有对以上方法的详细分析?我不想只得其法不得其意。

另外,如果我想在最后一列实现此行的SUM,可以实现么?

比如

id 2011-1-1 2011-1-2 sum
1 400 100 50……
[/Quote]

出问题了...我用我自己的表内容insert到#T中,结果只显示合计列了。。。

if not object_id('Tempdb..#T') is null
drop table #T
Go
Create table #T([id] int,[bupinmingcheng] nvarchar(50) ,[bupinfanhao] nvarchar(50) ,[shuliang] int,[date] Datetime)
Insert #T
select b.bupinlistid,b.bupinmingcheng,b.bupinfanhao,a.shuliang,a.[date] from bupin as a right join bupinlist as b on a.bupinlistid = b.bupinlistid and MONTH(a.date) = 9 where b.dalei = 'HTHT'

Go

declare @s nvarchar(4000)
set @s=''
Select @s=@s+N','+quotename(CONVERT(varchar(10),Date,120))+N'=sum(case when CONVERT(varchar(10),Date,120)=N'+quotename(CONVERT(varchar(10),Date,120),'''')+N' then shuliang end)'

from #T group by date
--顯示生成語句
print N'select ID'+@s+N',sum([shuliang]) as 合计 from #T group by ID'

exec(N'select ID'+@s+N',sum([shuliang]) as 合计 from #T group by ID')
go

中国风 2011-11-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 harlow1999 的回复:]

追问:
用各位的语句都可以达到效果,也让我对SQL的强大再次羡慕。
那里可以有对以上方法的详细分析?我不想只得其法不得其意。

另外,如果我想在最后一列实现此行的SUM,可以实现么?

比如

id 2011-1-1 2011-1-2 sum
1 400 100 500
2 null 200 ……
[/Quote]



if not object_id('Tempdb..#T') is null
drop table #T
Go
Create table #T([id] int,[shuliang] int,[date] Datetime)
Insert #T
select 1,400,'2011-1-1' union all
select 1,500,'2011-1-1' union all
select 1,200,'2011-1-4' union all
select 2,100,'2011-1-5'
Go

declare @s nvarchar(4000)
set @s=''
Select @s=@s+N','+quotename(CONVERT(varchar(10),Date,120))+N'=sum(case when CONVERT(varchar(10),Date,120)=N'+quotename(CONVERT(varchar(10),Date,120),'''')+N' then shuliang end)'

from #T group by date
--顯示生成語句
print N'select ID'+@s+N',sum([shuliang]) as 合计 from #T group by ID'

exec(N'select ID'+@s+N',sum([shuliang]) as 合计 from #T group by ID')
go
/*
ID 2011-01-01 2011-01-04 2011-01-05 合计
1 900 200 NULL 1100
2 NULL NULL 100 100
*/
沉默的羔羊 2011-11-20
  • 打赏
  • 举报
回复
追问:
用各位的语句都可以达到效果,也让我对SQL的强大再次羡慕。
那里可以有对以上方法的详细分析?我不想只得其法不得其意。

另外,如果我想在最后一列实现此行的SUM,可以实现么?

比如

id 2011-1-1 2011-1-2 sum
1 400 100 500
2 null 200 200

中国风 2011-11-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 harlow1999 的回复:]

请问如果是结合ASP.NET,
是不是直接调用事务?
[/Quote]

用存储过程就行了

在语句前加

Create proc P
as
....上面语句

go
程序exec p
沉默的羔羊 2011-11-19
  • 打赏
  • 举报
回复
请问如果是结合ASP.NET,
是不是直接调用事务?
沉默的羔羊 2011-11-19
  • 打赏
  • 举报
回复
感谢大家的回复先。
已经在仔细阅读并学习了。
中国风 2011-11-19
  • 打赏
  • 举报
回复
--> --> (Roy)生成測試數據

if not object_id('Tempdb..#T') is null
drop table #T
Go
Create table #T([id] int,[shuliang] int,[date] Datetime)
Insert #T
select 1,400,'2011-1-1' union all
select 1,500,'2011-1-1' union all
select 1,200,'2011-1-4' union all
select 2,100,'2011-1-5'
Go



--SQL2005

declare @s nvarchar(4000)
Select @s=isnull(@s+',','')+quotename(CONVERT(varchar(10),Date,120)) from #T group by date
exec('select * from (select ID,CONVERT(varchar(10),Date,120) as date,shuliang from #T) as a pivot (max(shuliang) for date in('+@s+'))b')
/*
ID 2011-01-01 2011-01-04 2011-01-05
1 500 200 NULL
2 NULL NULL 100
*/
中国风 2011-11-19
  • 打赏
  • 举报
回复
--> --> (Roy)生成測試數據

if not object_id('Tempdb..#T') is null
drop table #T
Go
Create table #T([id] int,[shuliang] int,[date] Datetime)
Insert #T
select 1,400,'2011-1-1' union all
select 1,500,'2011-1-1' union all
select 1,200,'2011-1-4' union all
select 2,100,'2011-1-5'
Go

declare @s nvarchar(4000)
set @s=''
Select @s=@s+N','+quotename(CONVERT(varchar(10),Date,120))+N'=max(case when CONVERT(varchar(10),Date,120)=N'+quotename(CONVERT(varchar(10),Date,120),'''')+N' then shuliang end)'

from #T group by date
--顯示生成語句
print N'select ID'+@s+N' from #T group by ID'

exec(N'select ID'+@s+N' from #T group by ID')

go
/*
ID 2011-01-01 2011-01-04 2011-01-05
1 500 200 NULL
2 NULL NULL 100
*/
--小F-- 2011-11-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dawugui 的回复:]
SQL code
declare @sql varchar(8000)
set @sql = 'select id '
select @sql = @sql + ' , sum(case date when ''' + convert(varchar(10),date,120) + ''' then shuliang else null end) [' + convert(varchar(1……
[/Quote]
加载更多回复(3)

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧