首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

求~Group by 语句(挺有意思的),该怎么解决

2012-03-31 
求~~~~~~Group by 语句(挺有意思的)IDBarCodeBoxNo(大箱条码)ProduceNoGoodsID(货号)MeterUnitID(单位ID)1

求~~~~~~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 table Table1


(
ID int ,
BarCode varchar(20),
BoxNo varchar(20),
ProduceNo int,
GoodsID varchar(20),
Meter int,
UnitID int
)
go
INSERT INTO Table1
SELECT 1, '200001 ', '200001 ',100000, '001 ',34,1 UNION ALL
SELECT 2, '200002 ', '200001 ',100000, '001 ',34,1 UNION ALL
SELECT 3, '200003 ', '200001 ',100001, '002 ',6,1 UNION ALL
SELECT 4, '200004 ', '200002 ',100001, '001 ',43,1

select count(*) as [件数], GoodsID as [货号], ProduceNo as [生产制单号],
sum(Meter) as [米数], ' ' as [单位],cast(min(Meter) as varchar)+ '* '+cast(count(1)as varchar) as 包装
from Table1
group by GoodsID, ProduceNo, UnitID, BoxNo
--结果
件数 货号 生产制单号 米数 单位 包装
----------- -------------------- ----------- ----------- ---- -------------------------
2 001 100000 68 34*2
1 001 100001 43 43*1
1 002 100001 6 6*1

(3 行受影响)
[解决办法]
---下面是例子
create table Table1
(
ID int ,
BarCode varchar(20),
BoxNo varchar(20),
ProduceNo int,
GoodsID varchar(20),
Meter int,
UnitID int
)
go
INSERT INTO Table1
SELECT 1, '200001 ', '200001 ',100000, '001 ',34,1 UNION ALL
SELECT 2, '200002 ', '200001 ',100000, '001 ',34,1 UNION ALL
SELECT 3, '200003 ', '200001 ',100001, '002 ',6,1 UNION ALL
SELECT 4, '200004 ', '200002 ',100001, '001 ',43,1


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

select count(GoodsID) as [件数],
GoodsID as [货号],
ProduceNo as [生产制单号],
sum(Meter) as [米数],
[包装情况]=dbo.f1(GoodsID)
from Table1
group by GoodsID, ProduceNo

热点排行