sql脚本如何foreach?

帅员外 2011-01-05 03:38:37
小弟现在有个问题。
因为要处理 1:N:N的表(也就是多对多结构)
以下是 写的汇总。
但是人家要报表。
所以我想问问如何sql脚本如何foreach?
HBSR_HS_SG_BE 是表1 ,HBSR_HS_SG_BE_Line1,HBSR_HS_SG_BE_Line2 都是依赖表1的。
我知道问题可能太复杂了。
请大家给点建议就好。
谢谢各位了。

HBSR_HS_SG_BE.HBSR_HS_SG_BE.EntityList sgList = HBSR_HS_SG_BE.HBSR_HS_SG_BE.Finder.FindAll(oql);
if (sgList.Count > 0)
{
foreach (HBSR_HS_SG_BE.HBSR_HS_SG_BE sg in sgList)
{
ZJCNum += sg.ChickenQty;
ZMJSJZL += sg.ChickRealQty;
ZAveJZ += sg.AverageWeight;
#region 称重记录
//循环第一个页签
//计算 出栏只数(大鸡数量+小鸡数量) 总小鸡重量 总小鸡只数
foreach (HBSR_HS_SG_BE.HBSR_HS_SG_BE_Line1 line1 in sg.HBSR_HS_SG_BE_Line1)
{
if (line1.ItemInfo != null)
{
if (line1.ItemInfo.ItemCode.Equals("1000") ||
line1.ItemInfo.ItemCode.Equals("1002"))
{
ZCLNum += line1.RecycleNumber;

}
if (line1.ItemInfo.ItemCode.Equals("1002"))
{
ZXJZL += line1.ChickWeight; //小鸡 毛鸡重量
ZXJNum += line1.RecycleNumber;//小鸡数量
ZXJDTZL += line1.CarcassWeight;
}
if (line1.ItemInfo.ItemCode.Equals("1000"))
{
ZDJDTZL += line1.CarcassWeight;
}
}
}
#endregion
#region 品捡扣重
//循环第二个页签
foreach (HBSR_HS_SG_BE.HBSR_HS_SG_BE_Line2 line2 in sg.HBSR_HS_SG_BE_Line2)
{
if (line2.KZCode != null)
{
switch (line2.KZCode.Name)
{
case "嗉料":
ZSL += line2.YKWeight;
break;
case "鸡胗内容物":
ZJZRRW += line2.YKWeight;
break;
case "病变":
ZBB += line2.YKWeight;
break;
case "死鸡":
ZSJZL += line2.YKWeight;
ZSJNum += line2.SiJiNum;
break;
}
}
}
#endregion
}

...全文
314 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
帅员外 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 feilniu 的回复:]

引用 11 楼 excaliburx 的回复:

select
ZDJDTZL = (select CarcassWeight from Cust_HBSR_HS_SG_BE_Line1 where ItemInfo_ItemCode='1000' and Cust_HBSR_HS_SG_BE.ID =Cust_HBSR_HS_SG_BE_Line1.HBSR_HS_SG_BE)
,*……
[/Quote]

要是join的话。
单头就会有 2行数据了。。。

人家不想要这样的。...
这样挺好。 自定义栏目。
客户很满意。
谢谢您的提醒。
feilniu 2011-01-05
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 excaliburx 的回复:]

select
ZDJDTZL = (select CarcassWeight from Cust_HBSR_HS_SG_BE_Line1 where ItemInfo_ItemCode='1000' and Cust_HBSR_HS_SG_BE.ID =Cust_HBSR_HS_SG_BE_Line1.HBSR_HS_SG_BE)
,* from Cust_HBSR_HS_SG_BE
……
[/Quote]

恭喜LZ没有陷入循环式思维的陷阱。

如上代码用JOIN实现,效率可能会再高一点。
帅员外 2011-01-05
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 feilniu 的回复:]
引用 4 楼 wxf163 的回复:

SQL不用foreach


当一个初学者想到“在SQL中如何写foreach”时,通常TA就要开始写低效、冗长的代码了。
[/Quote]

好久没有写sql了。
谢谢您的提醒。
feilniu 2011-01-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wxf163 的回复:]

SQL不用foreach
[/Quote]

当一个初学者想到“在SQL中如何写foreach”时,通常TA就要开始写低效、冗长的代码了。
帅员外 2011-01-05
  • 打赏
  • 举报
回复
select
ZDJDTZL = (select CarcassWeight from Cust_HBSR_HS_SG_BE_Line1 where ItemInfo_ItemCode='1000' and Cust_HBSR_HS_SG_BE.ID =Cust_HBSR_HS_SG_BE_Line1.HBSR_HS_SG_BE)
,* from Cust_HBSR_HS_SG_BE

。。。。
我纠结了。。。。
直接写就好了。。。。
不用游标,
谢谢各位的帮助。
把分散了。
nihao134711 2011-01-05
  • 打赏
  • 举报
回复
1.游标
2.遍历表tabl1

declare @s varchar(4000)
set @s ='select XX, '
select @s=@s+'Str1 '+field1+'xxx' from table1
set @s= @s+' from tb2'

exec(@s)
王向飞 2011-01-05
  • 打赏
  • 举报
回复
--给你一个简单的游标例子
DECLARE @BIANLIANG1 INT
DECLARE @BIANLIANG2 varchar(20)

DECLARE Employee_Cursor CURSOR FOR --定义一个游标
SELECT EmployeeID, Title FROM AdventureWorks.HumanResources.Employee;
OPEN Employee_Cursor; --打开游标
FETCH NEXT FROM Employee_Cursor INTO @BIANLIANG1,@BIANLIANG2 ; --获取游标中的记录
WHILE @@FETCH_STATUS = 0 --如果能成功取到记录
BEGIN
/* 这里写你要进行的操作代码 */
FETCH NEXT FROM Employee_Cursor INTO @BIANLIANG1,@BIANLIANG2; -- 获取下一条游标记录
END;
CLOSE Employee_Cursor; --关闭游标
DEALLOCATE Employee_Cursor; --销毁游标
GO
飘零一叶 2011-01-05
  • 打赏
  • 举报
回复
--创建游标
declare @cursor cursor
declare @id int
--设定游标欲操作的数据集
set @cursor=cursor for
select id from Cust_HBSR_HS_SG_BE
--打开游标
open @cursor
--移动游标指向到第一条数据,提取第一条数据存放在变量中
fetch next from @cursor into @id
--如果上一次操作成功则继续循环
while(@@fetch_status=0)
begin
--操作提出的数据
print @id
--继续提下一行
fetch next from @cursor into @id
end
--关闭游标
close @cursor
--删除游标
deallocate @cursor

这样。
帅员外 2011-01-05
  • 打赏
  • 举报
回复
  --创建游标
  declare @cursor cursor
  declare @id int
  --设定游标欲操作的数据集
  set @cursor=cursor for
  select id from Cust_HBSR_HS_SG_BE
  --打开游标
  open @cursor
  --移动游标指向到第一条数据,提取第一条数据存放在变量中
  fetch next from @cursor into @id,@_name
  --如果上一次操作成功则继续循环
  while(@@fetch_status=0)
  begin
  --操作提出的数据
  print @id
  --继续提下一行
  fetch next from @cursor into @id
  end
  --关闭游标
  close @cursor
  --删除游标
  deallocate @cursor

。。。

消息 137,级别 15,状态 2,第 15 行
必须声明标量变量 "@id"。
消息 137,级别 15,状态 2,第 17 行
必须声明标量变量 "@cursor"。
消息 137,级别 15,状态 2,第 20 行
必须声明标量变量 "@cursor"。
消息 137,级别 15,状态 2,第 22 行
必须声明标量变量 "@cursor"。
.. 什么情况?
快溜 2011-01-05
  • 打赏
  • 举报
回复
游标。。
ycproc 2011-01-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wxf163 的回复:]

SQL不用foreach
[/Quote]
for
王向飞 2011-01-05
  • 打赏
  • 举报
回复
SQL不用foreach
帅员外 2011-01-05
  • 打赏
  • 举报
回复
游标 是 sql 类似与 foreach 的?

好 我试试。
帅员外 2011-01-05
  • 打赏
  • 举报
回复
人家要 这样的形式。
单头-----单体1 ----单体2 都在 一起。
所以我想到了foreach

表头好处理,但是表1,表2 要不冗余不容易。
inner join 会表头HBSR_HS_SG_BE 会有冗余。不可取。
结构大概是这样
一张HBSR_HS_SG_BE 对应多张HBSR_HS_SG_BE_Line1,多张HBSR_HS_SG_BE_Line2
rucypli 2011-01-05
  • 打赏
  • 举报
回复
游标。。。。

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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