27,579
社区成员
发帖
与我相关
我的任务
分享
SELECT COUNT(*) AS [count]
FROM [group] a
WHERE a.[status]=1 --这个要不要你自己看需求
AND id NOT IN (
SELECT group_id
FROM project
WHERE id IN (SELECT project_id FROM project_expert WHERE project_status<>1)
)
AND id IN (SELECT group_id FROM project)
这个是有项目存在并项目都是1SELECT COUNT(*) AS [count]
FROM [group] a
INNER JOIN (
SELECT group_id
FROM project
WHERE id NOT IN (SELECT project_id FROM project_expert WHERE project_status<>1)
) b ON a.id=b.group_id
WHERE a.[status]=1
LZ试试
--测试数据
CREATE TABLE #group(
id INT ,
STATUS VARCHAR(20)
)
INSERT INTO #group
SELECT 1,'213121'
UNION ALL
SELECT 2,'232324'
UNION ALL
SELECT 3,'232555'
CREATE TABLE #project(
id INT ,
GROUP_id int
)
INSERT INTO #project
SELECT 1001,1
UNION ALL
SELECT 1002,1
UNION ALL
SELECT 1003,1
UNION ALL
SELECT 2001,2
UNION ALL
SELECT 2002,2
UNION ALL
SELECT 3001,3
UNION ALL
SELECT 3002,3
CREATE TABLE #project_expert(
id INT,
project_id INT,
expert_id INT,
project_status bit
)
INSERT INTO #project_expert
SELECT 1,1001,1,1
UNION ALL
SELECT 2,1002,2,0
UNION ALL
SELECT 3,1002,3,1
UNION ALL
SELECT 4,2001,4,1
UNION ALL
SELECT 5,2002,5,1
UNION ALL
SELECT 6,3001,6,0
UNION ALL
SELECT 7,3002,7,1;
--测试数据结束
WITH cte AS (--每个项目组所有的project_status总数
SELECT b.GROUP_id,COUNT(a.project_status) AS allpro
FROM #project_expert a
INNER JOIN #project b ON a.project_id=b.id
GROUP BY b.GROUP_id
),
cte2 AS (--每个项目组所有status为1的project总数
SELECT b.GROUP_id,COUNT(a.project_id) AS succpro
FROM #project_expert a
INNER JOIN #project b ON a.project_id=b.id
WHERE a.project_status=1
GROUP BY b.GROUP_id
),
--新增的代码
cte3 AS ( --你说的在项目专家表中没有的,比对相同项目组总项目数和项目专家中相同项目组的项目数
SELECT b.GROUP_id
FROM #project_expert a
INNER JOIN #project b ON a.project_id=b.id
GROUP BY b.GROUP_id
HAVING COUNT(distinct a.project_id)=COUNT(b.id)
)
--新增的代码结束
SELECT COUNT(a.group_id) AS cnt FROM cte a
INNER JOIN cte2 b ON a.group_id=b.group_id AND a.allpro=b.succpro--比较以上两表的project总数一样的
WHERE a.group_id IN (select GROUP_id FROM cte3)--新增的代码
cnt
-----------
1
(1 行受影响)
重新插入了一些数据,有你说的项目专家表中不存在的(1003),项目专家表中重复的(1002)的这些情况
WITH cte AS (--每个项目组所有的project_status总数
SELECT b.GROUP_id,COUNT(a.project_status) AS allpro
FROM #project_expert a
INNER JOIN #project b ON a.project_id=b.id
GROUP BY b.GROUP_id
),
cte2 AS (--每个项目组所有status为1的project总数
SELECT b.GROUP_id,COUNT(a.project_id) AS succpro
FROM #project_expert a
INNER JOIN #project b ON a.project_id=b.id
WHERE a.project_status=1
GROUP BY b.GROUP_id
)
SELECT COUNT(a.group_id) AS cnt FROM cte a
INNER JOIN cte2 b ON a.group_id=b.group_id AND a.allpro=b.succpro--比较以上两表的project总数一样的
以上代码就改了WITH cte AS (--每个项目组所有的project_status总数
SELECT b.GROUP_id,COUNT(a.project_status) AS allpro
把原来的a.project_id改成了a.project_status。统计project_status的总数,这样就算你说的有多条project_id相同的数据也没事,我们统计project_status的总数和project_status=1的总数比较就可以了[/quote]
那如果项目不一定在项目专家表里,那它就没有项目状态了,那该怎么查呢,求指教
WITH cte AS (--每个项目组所有的project_status总数
SELECT b.GROUP_id,COUNT(a.project_status) AS allpro
FROM #project_expert a
INNER JOIN #project b ON a.project_id=b.id
GROUP BY b.GROUP_id
),
cte2 AS (--每个项目组所有status为1的project总数
SELECT b.GROUP_id,COUNT(a.project_id) AS succpro
FROM #project_expert a
INNER JOIN #project b ON a.project_id=b.id
WHERE a.project_status=1
GROUP BY b.GROUP_id
)
SELECT COUNT(a.group_id) AS cnt FROM cte a
INNER JOIN cte2 b ON a.group_id=b.group_id AND a.allpro=b.succpro--比较以上两表的project总数一样的
以上代码就改了WITH cte AS (--每个项目组所有的project_status总数
SELECT b.GROUP_id,COUNT(a.project_status) AS allpro
把原来的a.project_id改成了a.project_status。统计project_status的总数,这样就算你说的有多条project_id相同的数据也没事,我们统计project_status的总数和project_status=1的总数比较就可以了--测试数据
if not object_id(N'Tempdb..#group') is null
drop table #group
Go
Create table #group([id] int,[status] int)
Insert #group
select 1,1 union all
select 2,0
GO
if not object_id(N'Tempdb..#project') is null
drop table #project
Go
Create table #project([id] int,[group_id] int)
Insert #project
select 1,1 union all
select 2,1 union all
select 3,2
GO
if not object_id(N'Tempdb..#project_expert') is null
drop table #project_expert
Go
Create table #project_expert([id] int,[project_id] int,[expert_id] int,[project_status] int)
Insert #project_expert
select 1,1,1,0 union all
select 2,2,2,0 union all
select 3,3,3,1 union all
select 4,1,1,0
Go
--测试数据结束
SELECT COUNT(1)AS 组数
FROM #group
JOIN #project ON #project.group_id = #group.id
WHERE NOT EXISTS ( SELECT 1
FROM #project_expert
WHERE project_id = #project.id
AND project_status <> 1 )
--测试数据
CREATE TABLE #group(
id INT ,
STATUS VARCHAR(20)
)
INSERT INTO #group
SELECT 1,'213121'
UNION ALL
SELECT 2,'232324'
UNION ALL
SELECT 3,'232555'
CREATE TABLE #project(
id INT ,
GROUP_id int
)
INSERT INTO #project
SELECT 1001,1
UNION ALL
SELECT 1002,1
UNION ALL
SELECT 1003,1
UNION ALL
SELECT 2001,2
UNION ALL
SELECT 2002,2
UNION ALL
SELECT 3001,3
UNION ALL
SELECT 3002,3
CREATE TABLE #project_expert(
id INT,
project_id INT,
expert_id INT,
project_status bit
)
INSERT INTO #project_expert
SELECT 1,1001,1,1
UNION ALL
SELECT 2,1002,2,0
UNION ALL
SELECT 3,1003,3,1
UNION ALL
SELECT 4,2001,4,1
UNION ALL
SELECT 5,2002,5,1
UNION ALL
SELECT 6,3001,6,0
UNION ALL
SELECT 7,3002,7,1
--测试数据结束
WITH cte AS (--每个项目组所有的project总数
SELECT b.GROUP_id,COUNT(a.project_id) AS allpro
FROM #project_expert a
INNER JOIN #project b ON a.project_id=b.id
GROUP BY b.GROUP_id
),
cte2 AS (--每个项目组所有status为1的project总数
SELECT b.GROUP_id,COUNT(a.project_id) AS succpro
FROM #project_expert a
INNER JOIN #project b ON a.project_id=b.id
WHERE a.project_status=1
GROUP BY b.GROUP_id
)
SELECT COUNT(a.group_id) AS cnt FROM cte a
INNER JOIN cte2 b ON a.group_id=b.group_id AND a.allpro=b.succpro--比较以上两表的project总数一样的
cnt
-----------
1
(1 行受影响)
SELECT COUNT(1) AS 个数 FROM [group] WHERE status=1