比如表如下
id1 id2 money
1 1 1
2 2 1
3 2 1
4 2 1
5 2 1id1是主键,如果id1=id2说明是新建的数据,如果id1!=id2 则是根据id2所代表的数据复制过来的。(比如3是根据2复制的,4也是根据2复制的,5也是)现在要求 如果是复制数据的话 统计money的时候去统计改数据所复制的那个案件中的money,如果复制源数据已经删了(就是id1=2的那条数据没有了),并且根据这个复制源复制了多条数据,则在这个复制源所复制出的案件中 取id1最大的那个money. 望指教
id1 id2 money
1 1 1
2 2 1
3 2 1
4 2 1
5 2 1id1是主键,如果id1=id2说明是新建的数据,如果id1!=id2 则是根据id2所代表的数据复制过来的。(比如3是根据2复制的,4也是根据2复制的,5也是)现在要求 如果是复制数据的话 统计money的时候去统计改数据所复制的那个案件中的money,如果复制源数据已经删了(就是id1=2的那条数据没有了),并且根据这个复制源复制了多条数据,则在这个复制源所复制出的案件中 取id1最大的那个money. 望指教
select t.* from tb t where not exists (select 1 from tb where id2 = t.id2 where id1 > t.id1)如果上述不对,请:
建议你提供详细的资料:
例如表的结构,表之间的关系,测试数据,相关算法及需要的结果。
这样有助于我们理解你的意思,更主要的是能尽快让你获得答案或解决问题的方法。
go
--> -->
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([id1] int,[id2] int,[money] int)
Insert #T
select 1,1,1 union all
select 2,2,1 union all
select 3,2,1 union all
select 4,2,1 union all
select 5,2,1
Go
SELECT id1,id2,[money]
FROM
(Select
*,ROW_NUMBER()OVER(PARTITION BY id2 ORDER BY CASE WHEN id1=id2 THEN 1 ELSE 0 END asc,[money] desc,id1) AS row
from #T AS a
)t
WHERE row=1/*
id1 id2 money
1 1 1
3 2 1*/
go
--> -->
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([id1] int,[id2] int,[money] int)
Insert #T
select 1,1,1 union all
select 2,2,1 union all
select 3,2,1 union all
select 4,2,1 union all
select 5,2,1
Go
DELETE a FROM #T AS a WHERE id1=id2 AND EXISTS(SELECT 1 FROM #T WHERE id2=a.id2 AND id1<>a.id1)SELECT * FROM #T
/*
id1 id2 money
1 1 1
3 2 1
4 2 1
5 2 1
*/
select
T.id1,
case when A.money is not null then A.money
else then B.money
end
from
table T
left join(select max(money) as money,id1 from table where id1=id2 group by id1)as A on t.id1=A.id1
left join(select max(money) as money,id1 from table where id1!=id2 group by id1)as B on t.id1=B.id1
管理号 关联管理号 money 月份
1111 1111 10000 1
1112 1111 5000 2
1113 1111 4000 3
1114 1111 3000 4
1115 1110 1000 6
1116 1110 2000 5要统计每个月的money分三种情况!
1.如果 管理号 = 关联管理号 就取该数据的money进行统计
2.如果 管理号 != 关联管理号 并且 关联管理号 所对应的 管理号 存在 就取所关联的管理号的money进行 统计,(如果多个数据关联相同一个管理号 统计的时候只统计一个关联的管理号,如1111~1114,统计的时候 就只统计1111的money)
3.如果 管理号 !=关联管理号 并且 所关联的管理号数据不存在 如1115~1116 所对应的1110数据不存在
就取管理号最大的去统计,也就是在1115~1116中只统计1116的money.但显示的时候却是按照月份最大的 显示的 也就是说1116这条数据的money 要显示在6月份里按照上表所示,查询效果如下
1月份 2月份 3月份 4月份 5月份 6月份
10000 0 0 0 0 2000 很棘手啊
go
--> -->
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([管理号] int,[关联管理号] int,[money] int,[月份] int)
Insert #T
select 1111,1111,10000,1 union all
select 1112,1111,5000,2 union all
select 1113,1111,4000,3 union all
select 1114,1111,3000,4 union all
select 1115,1110,1000,6 union all
select 1116,1110,2000,5
Go
DECLARE @s NVARCHAR(4000)Select @s=ISNULL(@s+',','select ')+QUOTENAME(RTRIM([月份])+N'月份')+'=max( case when [月份]='+RTRIM([月份])+' then [money] else 0 end)'
from #T GROUP BY [月份]
--PRINT @s+N'from (SELECT a.[管理号],a.[关联管理号],a.[月份],case when b.[月份] is null then 0 else a.[money] end AS [money] FROM #T AS a left JOIN (SELECT [关联管理号],MIN([月份])[月份] FROM #T GROUP BY [关联管理号]) AS b ON a.[关联管理号]=b.[关联管理号] AND a.[月份]=b.[月份]) as t'
EXEC(@s+N'from (SELECT a.[管理号],a.[关联管理号],a.[月份],case when b.[月份] is null then 0 else a.[money] end AS [money] FROM #T AS a left JOIN (SELECT [关联管理号],MIN([月份])[月份] FROM #T GROUP BY [关联管理号]) AS b ON a.[关联管理号]=b.[关联管理号] AND a.[月份]=b.[月份]) as t')--生成語句
/*
select [1月份]=max( case when [月份]=1 then [money] else 0 end),[2月份]=max( case when [月份]=2 then [money] else 0 end),[3月份]=max( case when [月份]=3 then [money] else 0 end),[4月份]=max( case when [月份]=4 then [money] else 0 end),[5月份]=max( case when [月份]=5 then [money] else 0 end),[6月份]=max( case when [月份]=6 then [money] else 0 end)from (SELECT a.[管理号],a.[关联管理号],a.[月份],case when b.[月份] is null then 0 else a.[money] end AS [money] FROM #T AS a left JOIN (SELECT [关联管理号],MIN([月份])[月份] FROM #T GROUP BY [关联管理号]) AS b ON a.[关联管理号]=b.[关联管理号] AND a.[月份]=b.[月份]) as t
*/--結果顯示
/*
1月份 2月份 3月份 4月份 5月份 6月份
10000 0 0 0 2000 0
*/
还有不写存储过程行吗?现在的开发结构用存储过程会很麻烦,我都是用 select * into temptable from...
改改這樣處理use Tempdb
go
--> -->
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([管理号] int,[关联管理号] int,[money] int,[月份] int)
Insert #T
select 1111,1111,10000,1 union all
select 1112,1111,5000,2 union all
select 1113,1111,4000,3 union all
select 1114,1111,3000,4 union all
select 1115,1110,1000,6 union all
select 1116,1110,2000,5
Go
DECLARE @s NVARCHAR(4000)Select @s=ISNULL(@s+',','select ')+QUOTENAME(RTRIM([月份])+N'月份')+'=max( case when [月份]='+RTRIM([月份])+' then [money] else 0 end)'
from #T GROUP BY [月份]--顯示生成語句
/*
PRINT @s+N'
from
(SELECT a.[管理号],a.[关联管理号],CASE WHEN (b.con>1 AND b.IsManager=0 AND a.[管理号]=b.[管理号]) THEN b.[MaxMonth] ELSE a.[月份] END AS [月份],
case when b.con>1 AND ((b.IsManager=1 AND a.[money]=b.[money]) OR (b.con>1 AND b.IsManager=0 AND a.[管理号]=b.[管理号]) OR b.con=1 ) then a.[money] ELSE 0 end AS [money]
FROM #T AS a
INNER JOIN (SELECT [关联管理号],MAX([管理号]) AS [管理号],MIN([月份])[MinMonth],MAX([月份])[MaxMonth],MAX([money]) AS [money],max(CASE WHEN [关联管理号]=[管理号] THEN 1 ELSE 0 END) AS IsManager,COUNT(*) AS con FROM #T GROUP BY [关联管理号]) AS b
ON a.[关联管理号]=b.[关联管理号])t
'
*/
EXEC(@s+N'
from
(SELECT a.[管理号],a.[关联管理号],CASE WHEN (b.con>1 AND b.IsManager=0 AND a.[管理号]=b.[管理号]) THEN b.[MaxMonth] ELSE a.[月份] END AS [月份],
case when b.con>1 AND ((b.IsManager=1 AND a.[money]=b.[money]) OR (b.con>1 AND b.IsManager=0 AND a.[管理号]=b.[管理号]) OR b.con=1 ) then a.[money] ELSE 0 end AS [money]
FROM #T AS a
INNER JOIN (SELECT [关联管理号],MAX([管理号]) AS [管理号],MIN([月份])[MinMonth],MAX([月份])[MaxMonth],MAX([money]) AS [money],max(CASE WHEN [关联管理号]=[管理号] THEN 1 ELSE 0 END) AS IsManager,COUNT(*) AS con FROM #T GROUP BY [关联管理号]) AS b
ON a.[关联管理号]=b.[关联管理号])t
')--生成語句
/*
select [1月份]=max( case when [月份]=1 then [money] else 0 end),[2月份]=max( case when [月份]=2 then [money] else 0 end),[3月份]=max( case when [月份]=3 then [money] else 0 end),[4月份]=max( case when [月份]=4 then [money] else 0 end),[5月份]=max( case when [月份]=5 then [money] else 0 end),[6月份]=max( case when [月份]=6 then [money] else 0 end)
from
(SELECT a.[管理号],a.[关联管理号],CASE WHEN (b.con>1 AND b.IsManager=0 AND a.[管理号]=b.[管理号]) THEN b.[MaxMonth] ELSE a.[月份] END AS [月份],
case when b.con>1 AND ((b.IsManager=1 AND a.[money]=b.[money]) OR (b.con>1 AND b.IsManager=0 AND a.[管理号]=b.[管理号]) OR b.con=1 ) then a.[money] ELSE 0 end AS [money]
FROM #T AS a
INNER JOIN (SELECT [关联管理号],MAX([管理号]) AS [管理号],MIN([月份])[MinMonth],MAX([月份])[MaxMonth],MAX([money]) AS [money],max(CASE WHEN [关联管理号]=[管理号] THEN 1 ELSE 0 END) AS IsManager,COUNT(*) AS con FROM #T GROUP BY [关联管理号]) AS b
ON a.[关联管理号]=b.[关联管理号])t
*/
--結果顯示
/*
1月份 2月份 3月份 4月份 5月份 6月份
10000 0 0 0 0 2000
*/
固定月份直接寫就行了
select [1月份]=max( case when [月份]=1 then [money] else 0 end),[2月份]=max( case when [月份]=2 then [money] else 0 end),[3月份]=max( case when [月份]=3 then [money] else 0 end),[4月份]=max( case when [月份]=4 then [money] else 0 end),[5月份]=max( case when [月份]=5 then [money] else 0 end),[6月份]=max( case when [月份]=6 then [money] else 0 end)
from
(SELECT a.[管理号],a.[关联管理号],CASE WHEN (b.con>1 AND b.IsManager=0 AND a.[管理号]=b.[管理号]) THEN b.[MaxMonth] ELSE a.[月份] END AS [月份],
case when b.con>1 AND ((b.IsManager=1 AND a.[money]=b.[money]) OR (b.con>1 AND b.IsManager=0 AND a.[管理号]=b.[管理号]) OR b.con=1 ) then a.[money] ELSE 0 end AS [money]
FROM #T AS a
INNER JOIN (SELECT [关联管理号],MAX([管理号]) AS [管理号],MAX([月份])[MaxMonth],MAX([money]) AS [money],max(CASE WHEN [关联管理号]=[管理号] THEN 1 ELSE 0 END) AS IsManager,COUNT(*) AS con FROM #T GROUP BY [关联管理号]) AS b
ON a.[关联管理号]=b.[关联管理号])t/*
1月份 2月份 3月份 4月份 5月份 6月份
10000 0 0 0 0 2000
*/