日期:2014-05-19  浏览次数:20471 次

求~~~~~~Group by 语句(挺有意思的)



ID     BarCode   BoxNo(大箱条码)   ProduceNo   GoodsID(货号)Meter     UnitID(单位ID)
1       200001     200001                     100000         001                         34           1
2       200002     200001                     100000         001                         34           1
3       200003     200001                     100001         002                         6             1
4       200004     200002                     100001         001                         43           1


上面这样一个表(一条记录就是一个条码,也就是一个货物),  
表结构为:  
ID:关键字段    
BarCode:唯一索引(小盒子条码)    
BoxNo:大箱条码(用来装小盒子的)
ProduceNo:生产制单号
GoodsID:货物ID
Meter:每一件货有多少米


现在我显示的时候:
select   count(*)   as   [件数],     GoodsID   as   [货号],   ProduceNo   as   [生产制单号],
sum(Meter)   as   [米数],     Max(TblUnit.UnitName)   as   [单位]
from   Table1
left   join   TblUnit     on   TblUnit.UnitID=Table1.UnitID
group   by   GoodsID,   ProduceNo,   ColorID,     UnitID,   BoxNo

现在是:
件数       货号       生产制单号       米数     颜色     单位

多加一列,叫包装情况     (实际上BarCode就是一个小箱,包装的时候是N个小箱[就是N个条码BarCode放在大箱BoxNo里])

目的是这样的:
盒数       货号       生产制单号       米数     颜色     单位     包装情况
3             xxx         xxx                     xxx       xxx       xxx       2*32+44=108

包装情况的意思就是根据group   by   GoodsID,   ProduceNo,   ColorID,     UnitID,   BoxNo
这个分组的来计算     2是这一条记录有2盒为32M   44是另一盒为44米   加起来为1000米
全写出来就是:2盒*32米+1盒*44米=108米


最后这个包装情况要怎么写?

------解决方案--------------------
可以写一个用户定义函数来生成。
------解决方案--------------------
---try

create function f1(@id varchar(10))
as
begin
declare @cnt int
select @cnt = 0
select @cnt=@cnt+count(Meter)*Meter from TblUnit where GoodsID = @id group by Meter
return @cnt
end

select count(*) as [件数],
GoodsID as [货号],
ProduceNo as [生产制单号],
sum(Meter) as [米数],
Max(TblUnit.UnitName) as [单位],
[包装情况]=dbo.f1(GoodsID)
from Table1
left join TblUnit on TblUnit.UnitID=Table1.UnitID
group by GoodsID, ProduceNo, ColorID, UnitID, BoxNo

------解决方案--------------------
create