[英]SQL query excluding specific values for the same column
I would like to generate a project progress report which consists in pretty much checking the % of completed milestones within a given timeframe. 我想生成一个项目进度报告,其中包括几乎检查给定时间范围内已完成里程碑的百分比。 (eg: Company A had 10 due milestones by today, but marked only 8 as completed, therefore they are progressing 20% slower than planned.) (例如:A公司今天有10个到期里程碑,但仅标记为8个已完成,因此它们的进度比计划慢20%。)
This part easy and it is working great, however before generating it, I have a determine if a project plan is approved or not. 这部分很容易,而且效果很好,但在生成之前,我确定项目计划是否获得批准。 An approved project plan is the one with milestones 1 and 2 = 100. 已批准的项目计划是里程碑1和2 = 100的项目计划。
Below you can see the table structure I have to work with. 下面你可以看到我必须使用的表结构。
ID Company Project Milestone Date Completion
170825240 Company A Project 1 Milestone 1 29.10.12 100
170825311 Company A Project 1 Milestone 2 29.10.12 0
170825242 Company A Project 1 Milestone 3 05.11.12 100
170825173 Company A Project 1 Milestone 4 17.12.12 0
170825104 Company B Project 1 Milestone 1 29.10.12 100
170825035 Company B Project 1 Milestone 2 29.10.12 100
170824966 Company B Project 1 Milestone 3 05.11.12 100
170824897 Company B Project 1 Milestone 4 17.12.12 0
170824828 Company C Project 1 Milestone 1 29.10.12 100
170824759 Company C Project 1 Milestone 2 29.10.12 100
170824690 Company C Project 1 Milestone 3 05.11.12 0
170824621 Company C Project 1 Milestone 4 17.12.12 0
In this snapshot, project 1 is approved for the companies B and C. 在此快照中,项目1被批准用于公司B和C.
The issue I am facing is how to combine in a single query progress filtering the approved plans only. 我面临的问题是如何在单个查询中组合仅过滤已批准的计划的进度。 I would hate to write the exceptions manually, since we are talking about 1600 combinations for company and projects. 我不想手动编写例外,因为我们正在讨论公司和项目的1600种组合。
Anyone has an idea how to do it? 任何人都知道如何做到这一点?
Thanks!!!! 谢谢!!!!
UPDATED 更新
SELECT S1.[Company], COUNT(S1.[Milestone]) AS ShouldBeMilestones
FROM Sheet1 AS S1
INNER JOIN Sheet1 S2
ON S2.[Company] = S1.[Company]
AND S2.[Project] = S1.[Project]
AND S2.[Milestone] = 'Milestone 1'
AND S2.[%compl#] = 100
INNER JOIN Sheet1 S3
ON S3.[Company] = S1.[Company]
AND S3.[Project] = S1.[Project]
AND S3.[Milestone] = 'Milestone 2'
AND S3.[%compl#] = 100
WHERE ((S1.[Task class] <> 'A') AND (S1.[Task class] <> 'B') AND (S1.[Task class] <> ''))
AND S1.[Milestone] NOT LIKE '0.*' AND S1.[Milestone] NOT LIKE '1.*'
AND S1.[Start] <= Now()
GROUP BY S1.[Company];
Add two where
conditions, each one checking for the completion of a milestone: 添加两个where
的条件下,每一个检查一个里程碑的完成:
from Milestones m
where exists
(
select *
from Milestones m1
where m1.Company = m.Company
and m1.Project = m.Project
and m1.Milestone = 'Milestone 1'
and m1.Completion = 100
)
and exists
(
select *
from Milestones m2
where m2.Company = m.Company
and m2.Project = m.Project
and m2.Milestone = 'Milestone 2'
and m2.Completion = 100
)
this is also possible with joins borrowing from the previous answer ;) 从上一个答案中借用联接也可以做到这一点;)
select m.*
(from Milestones m
inner join Milesones as m1
on m1.Company = m.Company
and m1.Project = m.Project
and m1.Milestone = 'Milestone 1'
and m1.Completion = 100)
inner join Milestones as m2
on m2.Company = m.Company
and m2.Project = m.Project
and m2.Milestone = 'Milestone 2'
and m2.Completion = 100
edit should adress some ms access issues but cant test it on access honestly i don't see the benefit of the () around the first join 编辑应该解决一些ms访问问题,但不能在访问上测试它老实说我没有看到第一次加入的()的好处
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.