简体   繁体   English

SQL查询,不包括同一列的特定值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM