请教这个SQL怎么写?

来源:百度知道 编辑:UC知道 时间:2024/06/16 23:06:00
表中记录:
ID 名称 数量 操作类型
1 大米 100 I
2 大米 -50 O
3 大米 20 R

出来的结果要求这样:

物品 I数量 O数量 R数量 剩余数量
大米 100 -50 20 70

请达人说的详细一点!
参照--0零零柒--的语句该了该,要求的结果出来了。
select t.名称,
sum(case t.操作类型 when 'I' then t.op_qty else 0 end) 入库数量,
sum(case t.操作类型 when 'O' then t.op_qty else 0 end) 出库数量,
sum(case t.操作类型 when 'R' then t.op_qty else 0 end) 退回数量,
sum(t.数量 as 库存
from t
group by t.名称

但是我想问问效率问题,因为这是查库存的报表,列不光包括“名称”,可能还有其他如“单位”,“类别”的信息等字段,而且数据量还不小,要怎样才能效率最大化?
请老鸟指点!回答问题的朋友可以互相指出优劣,真理最大嘛!呵呵,诚心向各位请教!
请回答的认真详细点,如果满意追加100.

select 物品 ,
max(case 操作类型 when 'I' then 数量 else 0 end) I数量,
max(case 操作类型 when 'O' then 数量 else 0 end) O数量,
max(case 操作类型 when 'R' then 数量 else 0 end) R数量 ,
sum(数量) as 剩余数量
from 表名
group by 物品

我感觉这种的效率已经很高了,还有一种可以使用自连接,相当与要在三张表上查,那种效率更低,如果还有其他如“单位”,“类别”的信息等字段,只要加上就可以了。

declare @sql varchar(8000)
set @sql = 'select 名称 '
select @sql = @sql + ' , max(case 操作类型 when ''' + 操作类型 + ''' then 数量 else 0 end) [' + 操作类型 + ']'
from (select distinct 操作类型 from tb) as a
set @sql = @sql + ', sum(数量) 剩余数量 from tb group by 名称'
exec(@sql)

-------------------------
没有试过这个语句吗?如此强大的语句。。。。。。只因为你看不懂而抛弃。

--> -->

if not object_id('Tempdb..#T') is null
drop table #T
Go
Create table #T([ID] int,[名称] nvarchar(2),[数量] int,[操作类型] nvarchar(1))
Insert #T
select 1,N'大米',100,