Join后,再Sum的问题

ofaint 2007-03-30 02:05:44
任务表 Task
编号 车辆 运费
1 T1 1000
2 T2 1500
3 T2 800

费用表 Fee
编号 任务编号 费用项 金额
1 1 过路费 100
2 1 补胎费 20
3 1 罚款 50
4 2 过路费 80
5 3 过路费 120
6 3 罚款 60

我想得到这样的结果:

车辆 运费 过路费 补胎费 罚款
T1 1000 100 20 50
T2 2300 200 60
...全文
516 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
paoluo 2007-03-31
  • 打赏
  • 举报
回复
ofaint() , 你的費用項是固定只有那麼三種嗎?
ofaint 2007-03-31
  • 打赏
  • 举报
回复
gaoninggao,你的语句,会导致运费重复计算。
谢谢paoluo(一天到晚游泳的鱼)dawugui(潇洒老乌龟),谢谢CCTV
gaoninggao 2007-03-30
  • 打赏
  • 举报
回复
select 车辆, sum(运费) 运费 , sum((case when 费用项='过路费' then 金额 else 0 end )) as 过路费,
sum((case when 费用项='补胎费' then 金额 else 0 end )) as 补胎费
,sum((case when 费用项='罚款' then 金额 else 0 end )) as 罚款
from task join fee on task.编号=fee.任务编号 group by 车辆
dawugui 2007-03-30
  • 打赏
  • 举报
回复
if object_id('pubs..Task') is not null
drop table Task
go

create table Task(编号 int,车辆 varchar(10),运费 int)
insert into Task(编号,车辆,运费) values(1, 'T1', 1000)
insert into Task(编号,车辆,运费) values(2, 'T2', 1500)
insert into Task(编号,车辆,运费) values(3, 'T2', 800)
go

if object_id('pubs..Fee') is not null
drop table Fee
go

create table Fee(编号 int,任务编号 int,费用项 varchar(10),金额 int)
insert into Fee(编号,任务编号,费用项,金额) values(1, 1, '过路费', 100)
insert into Fee(编号,任务编号,费用项,金额) values(2, 1, '补胎费', 20)
insert into Fee(编号,任务编号,费用项,金额) values(3, 1, '罚款 ', 50)
insert into Fee(编号,任务编号,费用项,金额) values(4, 2, '过路费', 80)
insert into Fee(编号,任务编号,费用项,金额) values(5, 3, '过路费', 120)
insert into Fee(编号,任务编号,费用项,金额) values(6, 3, '罚款 ', 60)
go

select 车辆 , sum(运费) 运费 , sum(过路费) 过路费 , sum(补胎费) 补胎费, sum(罚款) 罚款 from
(
select Task.车辆 , task.运费 , t.过路费 , t.补胎费 , t.罚款 from task,
(
select 任务编号,
sum(case when 费用项 = '过路费' then 金额 else 0 end) as 过路费,
sum(case when 费用项 = '补胎费' then 金额 else 0 end) as 补胎费,
sum(case when 费用项 = '罚款' then 金额 else 0 end) as 罚款
from fee
group by 任务编号
) t
where task.编号 = t.任务编号
) m
group by 车辆

drop table Fee
drop table Task

/*
车辆 运费 过路费 补胎费 罚款
---------- ----------- ----------- ----------- -----------
T1 1000 100 20 50
T2 2300 200 0 60

(所影响的行数为 2 行)

*/
paoluo 2007-03-30
  • 打赏
  • 举报
回复
Create Table Task(编号 Int,车辆 Varchar(10),运费 Int)
Insert Into task
Select 1,'T1',1000
Union All Select 2,'T2',1500
Union All Select 3,'T2',800

Create Table Fee(编号 Int,任务编号 Int,费用项 Nvarchar(20),金额 Int)
Insert Into Fee
Select 1,1,N'过路费',100
Union All Select 2,1,N'补胎费',20
Union All Select 3,1,N'罚款',50
Union All Select 4,2,N'过路费',80
Union All Select 5,3,N'过路费',120
Union All Select 6,3,N'罚款',60
GO
Declare @S Nvarchar(4000), @S1 Nvarchar(4000)
Select @S='', @S1 = ''
Select @S=@S + N',SUM(Case When 费用项 = N'''+费用项+N''' Then 金额 Else 0 End) As '''+费用项+'''', @S1 = @S1 + ',SUM(B.' + 费用项 + ') As ' + 费用项
From Fee Group By 费用项
EXEC(N'Select A.车辆,SUM(A.运费) As ''运费'''+@S1 + N' From Task A,(Select 任务编号' + @S + N' From Fee Group By 任务编号 ) B where A.编号=B.任务编号 Group By A.车辆' )

Drop Table Task,Fee
--Result
/*
车辆 运费 补胎费 罚款 过路费
T1 1000 50 20 100
T2 2300 60 0 200
*/
ofaint 2007-03-30
  • 打赏
  • 举报
回复
Join之后,导致任务表的记录重复了,运费求和就不正确了
ofaint 2007-03-30
  • 打赏
  • 举报
回复
gahade,运费错了

车辆 运费 过路费 补胎费 罚款
T1 1000 100 20 50
T2 2300 200 60
gahade 2007-03-30
  • 打赏
  • 举报
回复
create table Task(编号 int,车辆 varchar(10),运费 int)
insert into task
select 1,'T1',1000
union all select 2,'T2',1500
union all select 3,'T2',800

create table Fee(编号 int,任务编号 int,费用项 varchar(20),金额 int)
insert into Fee
select 1,1,'过路费',100
union all select 2,1,'补胎费',20
union all select 3,1,'罚款',50
union all select 4,2,'过路费',80
union all select 5,3,'过路费',120
union all select 6,3,'罚款',60

declare @sql varchar(8000)
set @sql=''
select @sql=@sql+',sum(case when 费用项 = '''+费用项+''' then 金额 else 0 end) as '''+费用项+''''
from (select 费用项,sum(金额) as '金额' from Fee,Task where Fee.任务编号=Task.编号 group by 费用项)t
exec('select 车辆,sum(运费) as ''运费'''+@sql+' from Task,Fee where Task.编号=Fee.任务编号 group by 车辆')
/*
车辆 运费 补胎费 罚款 过路费
---------- ----------- ----------- ----------- -----------
T1 3000 20 50 100
T2 3100 0 60 200
*/
ofaint 2007-03-30
  • 打赏
  • 举报
回复
两个表Join之后,车辆、运费重复行,如何不重复地对运费求和?
后面的费用行转变成列,已经解决

或许,整个思路是错误的?
lin_now 2007-03-30
  • 打赏
  • 举报
回复
先做沙发
内容概要:本文系统研究了开关频率大于谐振频率(fs>fr)工况下,移相混合控制LLC谐振变换器在低压增益区域的工作特性,深入分析其在变频与移相结合控制模式下的调制机理、工作模态划分及损耗分布规律。通过Simulink平台构建高保真仿真模型,对变换器在不同负载和输入条件下的电压增益、转换效率、关键器件电压电流应力等性能指标进行了全面仿真验证,重点探讨了其在低增益区间的软开关实现能力与效率优化潜力,旨在提升LLC变换器在宽范围输入输出应用中的动态响应与能源转换效率。; 适合人群:从事电力电子变换器设计、高频电源开发及相关领域的高校研究生、科研院所研究人员及企业研发工程师,要求具备扎实的电路理论基础、电力电子技术知识以及一定的Simulink仿真能力。; 使用场景及目标:①深入理解LLC谐振变换器在fs>fr条件下采用移相混合控制的内在工作机理与模态转换过程;②掌握利用Simulink搭建复杂谐振变换器精确仿真模型的方法与技巧;③分析并优化低压增益区的增益特性与损耗构成,为设计高效率、高功率密度的软开关电源提供理论依据和数据支持; 阅读建议:建议读者结合文中所述仿真模型,亲自复现仿真过程,重点观察不同控制参数(如移相比、开关频率)对电压增益曲线和关键波形的影响,并对比传统变频控制策略,深入探究混合控制在拓宽调压范围、提升轻载效率方面的优势,从而深化对现代高效谐振电源设计的理解。
内容概要:本文提出了一种基于粒子群优化算法(PSO)的配电网光伏储能双层优化配置模型,以IEEE33节点系统为标准算例,实现光伏发电单元与储能系统的协同选址与定容优化。该模型采用双层架构设计,上层以投资成本、运行经济性及网络损耗最小为目标优化设备配置方案,下层通过潮流计算评估系统在不同负荷场景下的运行性能,综合考虑电压稳定性、供电可靠性及可再生能源消纳能力,最终通过Matlab编程实现完整求解流程,为高渗透率分布式电源接入背景下的配电网规划提供了有效的技术支撑。; 适合人群:具备电力系统分析基础和Matlab编程能力的研究生、高校科研人员及从事新能源并网、智能配电网规划与优化的工程技术人员。; 使用场景及目标:①研究含高比例光伏接入的配电网规划与运行协同优化问题;②掌握双层优化建模方法与粒子群算法在复杂电力系统问题中的应用技巧;③为实际工程中分布式光伏与储能系统的科学选址与容量配置提供理论依据与仿真验证平台。; 阅读建议:建议读者结合Matlab代码深入理解双层迭代求解机制,重点关注算法收敛性分析、参数敏感性测试,并可通过更换初始种群、调整权重因子或引入其他标准测试系统(如IEEE69节点)进行对比实验,进一步验证所提模型的普适性与鲁棒性。
内容概要:本文围绕双机并联虚拟同步发电机(VSG)在微电网中的功率分配、黑启动、虚拟阻抗与预同步控制展开,基于Simulink平台构建了完整的微电网系统仿真模型。重点研究了VSG在双机并联运行下的有功/无功功率均分控制策略,通过引入虚拟阻抗技术有效解决了因线路阻感比差异导致的功率分配不均问题。同时,设计了微电网黑启动流程与并网预同步控制模块,实现了待并网系统与主网在电压幅值、频率和相位上的精确同步,显著降低了并网冲击电流。系统整合了VSG控制、下垂控制、虚拟阻抗、锁相环(PLL)及预同步逻辑等关键环节,全面验证了多VSG协同运行的稳定性、自主恢复能力与并网可靠性。; 适合人群:具备电力系统、电力电子及自动控制等相关专业知识,从事微电网、分布式发电、VSG控制与并网技术研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①深入理解双机并联VSG系统中功率分配不均的机理及虚拟阻抗的补偿作用;②掌握微电网黑启动全过程及预同步控制的关键技术要点;③学习并实践基于Simulink的微电网多层次、多目标控制策略的建模与仿真方法;④为相关科研课题、毕业设计或实际工程项目提供可复现、可拓展的技术方案与仿真参考。; 阅读建议:建议结合提供的Simulink模型文件进行同步学习,重点关注VSG控制参数整定、虚拟阻抗设计原则、预同步切换逻辑等核心模块的实现细节,并可通过改变负载投切、线路参数或初始频率偏差等条件进行多工况仿真测试,以深入探究系统的动态响应特性与鲁棒性。

22,296

社区成员

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

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