簡體   English   中英

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

[英]SQL query excluding specific values for the same column

我想生成一個項目進度報告,其中包括幾乎檢查給定時間范圍內已完成里程碑的百分比。 (例如:A公司今天有10個到期里程碑,但僅標記為8個已完成,因此它們的進度比計划慢20%。)

這部分很容易,而且效果很好,但在生成之前,我確定項目計划是否獲得批准。 已批准的項目計划是里程碑1和2 = 100的項目計划。

下面你可以看到我必須使用的表結構。

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

在此快照中,項目1被批准用於公司B和C.

我面臨的問題是如何在單個查詢中組合僅過濾已批准的計划的進度。 我不想手動編寫例外,因為我們正在討論公司和項目的1600種組合。

任何人都知道如何做到這一點?

謝謝!!!!

更新

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];

添加兩個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
        )

從上一個答案中借用聯接也可以做到這一點;)

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

編輯應該解決一些ms訪問問題,但不能在訪問上測試它老實說我沒有看到第一次加入的()的好處

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM