日期:2014-05-18 浏览次数:20511 次
--> 测试数据: #A
if object_id('tempdb.dbo.#A') is not null drop table #A
create table #A (ID int,NAME varchar(6),MONEY int)
insert into #A
select 1,'车费',30 union all
select 1,'仓储费',500 union all
select 2,'搬运费',300
--> 测试数据: #B
if object_id('tempdb.dbo.#B') is not null drop table #B
create table #B (ID int,ITEM varchar(6),ACCOUNT int)
insert into #B
select 1,'服务费',200 union all
select 1,'仓储费',500
--> 测试数据: #C
if object_id('tempdb.dbo.#C') is not null drop table #C
create table #C (ID int,Name varchar(4))
insert into #C
select 1,'远航' union all
select 2,'英华'
SELECT C.*,T.* FROM
(
SELECT ID,NAME,SUM(应收)应收,SUM(成本) 成本, 0 AS RN
FROM
(
SELECT ID ,NAME,0 AS 应收,MONEY AS 成本 FROM #A
UNION ALL
SELECT ID,ITEM,ACCOUNT,0 FROM #B
) T GROUP BY ID,NAME
UNION ALL
SELECT ID,'合计毛利',0, SUM(应收)-SUM(成本) AS 合计毛利 ,1 AS RN
FROM
(
SELECT ID ,NAME,0 AS 应收,MONEY AS 成本 FROM #A
UNION ALL
SELECT ID,ITEM,ACCOUNT,0 FROM #B
) T GROUP BY ID
) T,#C C WHERE T.ID=C.ID
ORDER BY T.ID,T.RN
/*
(所影响的行数为 3 行)
(所影响的行数为 2 行)
(所影响的行数为 2 行)
ID Name ID NAME 应收 成本 RN
----------- ---- ----------- -------- ----------- ----------- -----------
1 远航 1 仓储费 500 500 0
1 远航 1 车费 0 30 0
1 远航 1 服务费 200 0 0
1 远航 1 合计毛利 0 170 1
2 英华 2 搬运费 0 300 0
2 英华 2 合计毛利 0 -300 1
(所影响的行数为 6 行)
------解决方案--------------------
select c.id,c.name,tb.name,tb.money from c left join (select id,name,money from a union all select id,item,account from b) tb on c.id=tb.id
------解决方案--------------------
---测试数据---
if object_id('[a]') is not null drop table [a]
go
create table [a]([ID] int,[NAME] varchar(6),[MONEY] int)
insert [a]
select 1,'车费',30 union all
select 1,'仓储费',500 union all
select 2,'搬运费',300
if object_id('[b]') is not null drop table [b]
go
create table [b]([ID] int,[ITEM] varchar(6),[ACCOUNT] int)
insert [b]
select 1,'服务费',200 union all
select 1,'仓储费',500
if object_id('[c]') is not null drop table [c]
go
create table [c]([ID] int,[Name] varchar(4))
insert [c]
select 1,'远航' union all
select 2,'英华'
---查询---
select
case when rn=1 then ltrim(ID) else '' end as ID,
case when rn=1 then 客户 else '' end as 客户,
费用名称,
应收,
成本
from(
select c.id,c.name as 客户,b.费用名称,
应收=sum(应收),
成本=sum(成本),
rn=row_number() over(partition by c.id order by getdate())
from c
left join
(
select id,name as 费用名称,[money] as 应收,0 as 成本 from a
union all
select id,ITEM,0,[ACCOUNT] from b
) b
on c.id=b.id
group by c.id,c.name,b.费用名称
) t
---结果---
ID 客户 费用名称 应收 成本
------------ ---- ------ ----------- -----------
1 远航 仓储费 500 500
车费 30 0
服务费 0