求1个查询语句。

tflb 2016-10-27 10:32:50
原问题:
table1
id name1 name2 name3 name4Numb
1 aa a1 a11 5
2 aa a2 null 4
3 bb b1 null 3
4 bb b2 null 3
5 cc c1 null 4

table2
id table1name2 name4
1 a1 ddd
2 a1 null
3 b1 null
4 c1 cccc


统计得到

name 总记录数据 未完成记录数1(name3 ) 未完成记录数2(name4 )
aa 2 1 8
bb 2 2 6
cc 1 1 3
name 总记录数据 未完成记录数1 都是table1
未完成记录数2 : 为 table1和table2关联后, table1.name4Numb 减去table2.name3 的未记入记录条数。
例: aa 包括a1和a2,都需要录入name4Numb 9条数据,而table2中的name4只有a1录入了两条没有a2,而且第二条也未录全,所以"未完成记录数2(name4 )"等于9-1=8;
bb 包括b1和b2,都需要录入name4Numb 6条数据,而table2中的name4只有b1录入了1条,而且这条也未录全,所以"未完成记录数2(name4 )"等于6-0=6;

版主roy_88给的答案如下:
use Tempdb
go
--> --> 中国风(Roy)生成測試數據

if not object_id(N'Tempdb..#table1') is null
drop table #table1
Go
Create table #table1([id] int,[name1] nvarchar(22),[name2] nvarchar(22),[name3] nvarchar(23),[name4Numb] int)
Insert #table1
select 1,N'aa',N'a1',N'a11',5 union all
select 2,N'aa',N'a2',null,4 union all
select 3,N'bb',N'b1',null,3 union all
select 4,N'bb',N'b2',null,3 union all
select 5,N'cc',N'c1',null,4
Go

if not object_id(N'Tempdb..#table2') is null
drop table #table2
Go
Create table #table2([id] int,[table1name2] nvarchar(22),[name4] nvarchar(24))
Insert #table2
select 1,N'a1',N'ddd' union all
select 2,N'a1',null union all
select 3,N'b1',null union all
select 4,N'c1',N'cccc'
Go
Select
a.[name1]
,COUNT(*) AS 总记录数
,SUM(CASE WHEN [name3] IS NULL THEN 1 ELSE 0 END) AS 未完成记录数1
,SUM(a.[name4Numb]-ISNULL(b.未完成,0)) AS 未完成记录数2
FROM #table1 AS a
LEFT JOIN (SELECT [table1name2],SUM(CASE WHEN [name4] IS NOT NULL THEN 1 ELSE 0 END) AS 未完成 FROM #table2 GROUP BY [table1name2]) AS b ON a.[name2]=b.[table1name2]
GROUP BY a.[name1]

/*
name1 总记录数 未完成记录数1 未完成记录数2
aa 2 1 8
bb 2 2 6
cc 1 1 3
*/
上面结果完全正确


现在问题:在加一个table3表
table3
id table2id name5
1 1 eee
2 1 ffff
3 2 tttt
4 3 yyyy

统计得到

name 总记录数据 未完成记录数1(name3 ) 未完成记录数2(name4 ) 未完成记录数3(name5)
aa 2 1 8 7
bb 2 2 6 5
cc 1 1 3 0

说明:未完成记录数3(name5),为表table2.id=table3.table2id ,table3中 table2id =1和2为a1,a1对应的table3表中如有一条信息,就1条,有多录的也算1条。然后用未完成记录数2(name4 ) -去a1统计后的数据。

感谢呀!!
...全文
203 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
tflb 2016-10-29
  • 打赏
  • 举报
回复
万分感谢,已按你的思想弄好了。
中国风 2016-10-28
  • 打赏
  • 举报
回复
拼凑一个逻辑,当name4为空时计算TABLE3的记录数,最后一条3同你的0有出入 e.g.
use Tempdb
go
--> --> 中国风(Roy)生成測試數據
  
if not object_id(N'Tempdb..#table1') is null
    drop table #table1
Go
Create table #table1([id] int,[name1] nvarchar(22),[name2] nvarchar(22),[name3] nvarchar(23),[name4Numb] int)
Insert #table1
select 1,N'aa',N'a1',N'a11',5 union all
select 2,N'aa',N'a2',null,4 union all
select 3,N'bb',N'b1',null,3 union all
select 4,N'bb',N'b2',null,3 union all
select 5,N'cc',N'c1',null,4
Go
 
if not object_id(N'Tempdb..#table2') is null
    drop table #table2
Go
Create table #table2([id] int,[table1name2] nvarchar(22),[name4] nvarchar(24))
Insert #table2
select 1,N'a1',N'ddd' union all
select 2,N'a1',null union all
select 3,N'b1',null union all
select 4,N'c1',N'cccc'
Go
--> --> 中国风(Roy)生成測試數據
 
if not object_id(N'Tempdb..#table3') is null
	drop table #table3
Go
Create table #table3([id] int,[table2id] int,[name5] nvarchar(24))
Insert #table3
select 1,1,N'eee' union all
select 2,1,N'ffff' union all
select 3,2,N'tttt' union all
select 4,3,N'yyyy'
Go

SELECT  a.[name1] ,
        COUNT(*) AS 总记录数 ,
        SUM(CASE WHEN [name3] IS NULL THEN 1
                 ELSE 0
            END) AS 未完成记录数1 ,
        SUM(a.[name4Numb] - ISNULL(b.con2, 0)) AS 未完成记录数2 ,
        SUM((a.[name4Numb] - ISNULL(b.con2, 0)-ISNULL(b.con3,0))) AS 未完成记录数4
FROM    #table1 AS a
        LEFT JOIN ( SELECT  b1.[table1name2] ,
                            COUNT(DISTINCT b1.[name4]) AS con2 ,
                            COUNT(CASE WHEN b1.name4 IS  NULL THEN b2.table2id END) AS con3
                    FROM    #table2 AS b1
                            LEFT JOIN (SELECT DISTINCT table2id FROM #table3 ) AS b2 ON b2.[table2id] = b1.id
                    GROUP BY b1.[table1name2]
                  ) AS b ON a.[name2] = b.[table1name2]
GROUP BY a.[name1];

/*
name1	总记录数	未完成记录数1	未完成记录数2	未完成记录数3
aa	2	1	8	7
bb	2	2	6	5
cc	1	1	3	3
*/
中国风 2016-10-28
  • 打赏
  • 举报
回复
未完成记录数3(name5) 7/5/0 --把运算逻辑列出来

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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