dbgrid显示如下数据:
单据号 供应商代码 供应商名称 制单人 物料代码 物料名称 数量 单价
PIn001 01.01 信达电子 王八 01.01 AAA 10 10
PIn001 01.01 信达电子 王八 01.02 bbb 10 10
PIn001 01.01 信达电子 王八 01.03 ccc 20 10
PIn001 01.01 信达电子 王八 01.04 ddd 30 20
PIn002 01.02 下滑电子 王伍 02.01 KKK 10 10
PIn002 01.02 下滑电子 王伍 02.02 XXX 10 20
PIn002 01.02 下滑电子 王伍 02.03 YYY 15 15
PIn003 01.03 泉州电子 小猫 03.01 abc 10 10
PIn003 01.03 泉州电子 小猫 03.02 fds 10 10
PIn005 01.03 哈哈电子 小猫 03.01 abc 10 10
PIn004 01.03 哈哈电子 小明 04.01 dds 10 10
PIn004 01.03 哈哈电子 小明 04.02 ddf 10 10
前面相同的记录是主表的数据,后面的物料开始是从表的,我通过Left outer关联起来
但是我想在dbgrid得到的效果是: 单据号 供应商代码 供应商名称 制单人 物料代码 物料名称 数量 单价
PIn001 01.01 信达电子 王八 01.01 AAA 10 10
01.02 bbb 10 10
01.03 ccc 20 10
01.04 ddd 30 20
PIn002 01.02 下滑电子 王伍 02.01 KKK 10 10
02.02 XXX 10 20
02.03 YYY 15 15
PIn003 01.03 泉州电子 小猫 03.01 abc 10 10
03.02 fds 10 10
PIn005 01.03 哈哈电子 小猫 03.01 abc 10 10
PIn004 01.03 哈哈电子 小明 04.01 dds 10 10
04.02 ddf 10 10 也就是要如何屏蔽前面相同的内容
单据号 供应商代码 供应商名称 制单人 物料代码 物料名称 数量 单价
PIn001 01.01 信达电子 王八 01.01 AAA 10 10
PIn001 01.01 信达电子 王八 01.02 bbb 10 10
PIn001 01.01 信达电子 王八 01.03 ccc 20 10
PIn001 01.01 信达电子 王八 01.04 ddd 30 20
PIn002 01.02 下滑电子 王伍 02.01 KKK 10 10
PIn002 01.02 下滑电子 王伍 02.02 XXX 10 20
PIn002 01.02 下滑电子 王伍 02.03 YYY 15 15
PIn003 01.03 泉州电子 小猫 03.01 abc 10 10
PIn003 01.03 泉州电子 小猫 03.02 fds 10 10
PIn005 01.03 哈哈电子 小猫 03.01 abc 10 10
PIn004 01.03 哈哈电子 小明 04.01 dds 10 10
PIn004 01.03 哈哈电子 小明 04.02 ddf 10 10
前面相同的记录是主表的数据,后面的物料开始是从表的,我通过Left outer关联起来
但是我想在dbgrid得到的效果是: 单据号 供应商代码 供应商名称 制单人 物料代码 物料名称 数量 单价
PIn001 01.01 信达电子 王八 01.01 AAA 10 10
01.02 bbb 10 10
01.03 ccc 20 10
01.04 ddd 30 20
PIn002 01.02 下滑电子 王伍 02.01 KKK 10 10
02.02 XXX 10 20
02.03 YYY 15 15
PIn003 01.03 泉州电子 小猫 03.01 abc 10 10
03.02 fds 10 10
PIn005 01.03 哈哈电子 小猫 03.01 abc 10 10
PIn004 01.03 哈哈电子 小明 04.01 dds 10 10
04.02 ddf 10 10 也就是要如何屏蔽前面相同的内容
以前是我是把数据集设置为缓存的,然后判断相同的赋值为空,但觉得这种方法繁琐
请问SQL要怎么实现?
例如主表
table1
FInterID FDate FNumber
1 2001 PIN01
2 2001 PIN02
从表table2
FInterID FName FAmount
1 01.01 10
1 01.02 20
1 01.03 30
2 02.01 40
2 02.02 50按理得到的是
FInterID FDate FNumber FName FAmount
1 2001 PIN01 01.01 10
1 2001 PIN01 01.02 20
1 2001 PIN01 01.03 30
2 2001 PIN02 02.01 40
2 2001 PIN02 02.02 50但我想得到的是如下:
FInterID FDate FNumber FName FAmount
1 2001 PIN01 01.01 10
01.02 20
01.03 30
2 2001 PIN02 02.01 40
02.02 50
update set 单据号='', 供应商代码 ='', 供应商名称='', 制单人='' from #t where
not exists (select 单据号,供应商代码,供应商名称,制单人,Min(物料代码) as 物料代码,物料名称,数量,单价
from #t group by 单据号)
slect * from #t
drop table #t
========================
没测试,应该可以实现的,就是这个思路
(select 单据号,供应商代码,供应商名称,制单人,Min(物料代码) as 物料代码,物料名称,数量,单价
from #t group by 单据号)//应该为
(select 单据号,供应商代码,供应商名称,制单人,Min(物料代码) as 物料代码,min(物料名称) as 物料名称 ,min(数量) as 数量,min(单价) as 单价
from #t group by 单据号,供应商代码,供应商名称,制单人)
讨论
如果你想显示内容(如每项的第一行)返回字段值,想显示内容空白(后面的那些)返回''
至于如何判断是否显示内容,你可以在查询语句中做一个标记来表示,或者在OnGetText事件中查询上一行的内容是否相同,不相同则显示内容,相同则显示空白
DBGrid怎么实现?
SET NOCOUNT ONif exists (select * from dbo.sysobjects where id = object_id('[#tmp_ClothImport]') and OBJECTPROPERTY(id, 'IsUserTable') = 1)
Drop table [#tmp_ClothImport]
select FirstRow=0, M.*, C.khdm as CustomerCode,C.khmc as Customer,
D.ID as ID_1,D.MasterID, D.CustomerID as CustomerID_1, D.ClothID, D.Quantity, D.Weight,
D.ImportType, WarehouseID, D.Memo as Memo_1,
L.bcdm as ClothCode,L.bcmc as Cloth, U.username
into #tmp_ClothImport
from ClothImportM M
left join ClothImportD D on D.MasterID=M.ID
left join khzlb C on C.ID=M.CustomerID
left join bczlb L on L.ID=D.ClothID
left join password U on U.ID=M.UserID
order by M.OrderNum, D.IDDeclare @M_ID BigInt, @M_ID2 BigInt, @D_ID BigInt, @D_ID2 BigInt
Declare cur_FirstRow CURSOR FOR
select ID, ID_1 from #tmp_ClothImport select @M_ID = 0, @D_ID=0
open cur_FirstRow
fetch next from cur_FirstRow into @M_ID2, @D_ID2while (@@FETCH_STATUS <> -1) begin
if (@M_ID<>@M_ID2) and (@D_ID<>@D_ID2) begin
update #tmp_ClothImport set FirstRow=1 where ID=@M_ID2 and ID_1=@D_ID2
select @M_ID=@M_ID2, @D_ID=@D_ID2
end
fetch next from cur_FirstRow into @M_ID2, @D_ID2
end
close cur_FirstRow
Deallocate cur_FirstRow
select * from #tmp_ClothImportdrop table #tmp_ClothImport
//Dephi中定义记录字段在字段的OnGetText中处理
procedure TfrmImportQuery.ADOQImportImportDateGetText(Sender: TField;
var Text: String; DisplayText: Boolean);
begin
if Sender.DateSet.FieldByName("FirstRow").AsInteger=1 then Text := Sender.AsString
else Text := '';
end;
M.*, C.khdm as CustomerCode,C.khmc as Customer, D.*, L.bcdm as ClothCode,L.bcmc as Cloth, U.username
from ClothImportM M
left join ClothImportD D on D.MasterID=M.ID
left join khzlb C on C.ID=M.CustomerID
left join bczlb L on L.ID=D.ClothID
left join password U on U.ID=M.UserID
order by M.OrderNum, D.ID