2016-01-25 52 views
0

下面的查詢有時會起作用。MS Access查詢性能問題

通常的問題是,當我運行查詢時,它不會顯示超過180年的那些記錄的記錄數,儘管它確實顯示了所有其他數據。

l_section & dim_performance_score是SharePoint 2010列表。

我想報告顯示,不到90天的記錄,> = 90和<期180日齡,以及> = 180天。

如果我創建五個不同的存儲查詢並將它們留在一起,則查詢將一致地工作。但是,當我將所有SQL整合到一個存儲查詢中時,事情就會變得很糟糕。不承擔性能問題,如果我嘗試查看設計窗口中的合併查詢,MS Access崩潰。這是JET的一個已知問題嗎?

要維護5個或6個不同的查詢來獲得一個答案似乎效率低下。

是我正在做的最好的方式去獲得所需的數據?

PARAMETERS [compare date] DateTime; 

SELECT 
    l_section.section, 
    [compare date] AS [As of Date], 
    total_count.[Total Records], 
    IIf([less_than_90].[<90 Days] Is Null,0,[less_than_90].[<90 Days]) AS [<90 Days], 
    IIf([greater_than_90].[>=90 & <180Days] Is Null,0,[greater_than_90].[>=90 & <180Days]) AS [>=90 & <180Days], 
    IIf([greater_than_180].[>=180 Days] Is Null,0,[greater_than_180].[>=180 Days]) AS [>=180 Days] 

FROM 
    (
     (
      (
       l_section 
       LEFT JOIN 
        (
         SELECT 
          since_modified.section, 
          Count(since_modified.section) AS [>=180 Days] 
         FROM 
          (
           SELECT 
            l_section.section, 
            IIf(dim_performance_score.[Modified] Is Null,0,DateDiff("d",dim_performance_score.[Modified],[compare date])) AS days_since_update 
           FROM 
            l_section 
           LEFT JOIN 
            dim_performance_score 
           ON 
            l_section.section = dim_performance_score.section 
          ) as since_modified 
         WHERE 
          (((since_modified.days_since_update)>=180)) 
         GROUP BY 
          since_modified.section 
        ) as greater_than_180 
       ON 
        l_section.section = greater_than_180.section 
      ) 
      LEFT JOIN 
       (
        SELECT 
         since_modified.section, 
         Count(since_modified.section) AS [<90 Days] 
        FROM 
         (
          SELECT 
           l_section.section, 
           IIf(dim_performance_score.[Modified] Is Null,0,DateDiff("d",dim_performance_score.[Modified],[compare date])) AS days_since_update 
          FROM 
           l_section 
          LEFT JOIN 
           dim_performance_score 
          ON 
           l_section.section = dim_performance_score.section 
         ) as since_modified 
        WHERE 
         (((since_modified.days_since_update)<90)) 
        GROUP BY 
         since_modified.section 
       ) as less_than_90 
      ON 
       l_section.section = less_than_90.section 
     ) 
     LEFT JOIN 
      (
       SELECT 
        since_modified.section, 
        Count(since_modified.section) AS [>=90 & <180Days] 
       FROM 
        (
         SELECT 
          l_section.section, 
          IIf(dim_performance_score.[Modified] Is Null,0,DateDiff("d",dim_performance_score.[Modified],[compare date])) AS days_since_update 
         FROM 
          l_section 
         LEFT JOIN 
          dim_performance_score 
         ON 
          l_section.section = dim_performance_score.section 
        ) as since_modified     
       WHERE 
        (((since_modified.days_since_update)>=90 
        And 
        (since_modified.days_since_update)<180)) 
       GROUP BY 
        since_modified.section 
      ) as greater_than_90 
     ON 
      l_section.section = greater_than_90.section 
    ) 
    LEFT JOIN 
     (
      SELECT 
       l_section.section, 
       Count(IIf([section] Is Null,0,[section])) AS [Total Records] 
      FROM 
       l_section 
      LEFT JOIN 
       dim_performance_score 
      ON 
       l_section.section = dim_performance_score.section 
      GROUP BY l_section.section 
     ) as total_count 
    ON 
     l_section.section = total_count.section 
ORDER BY l_section.section; 

回答

0

三重嵌套連接?這是不對的。它看起來每個連接都是(或應該是)在同一個層次上。

PARAMETERS [compare date] DateTime; 

SELECT 
    l_section.section, 
    [compare date] AS [As of Date], 
    total_count.[Total Records], 
    IIf([less_than_90].[<90 Days] Is Null,0,[less_than_90].[<90 Days]) AS [<90 Days], 
    IIf([greater_than_90].[>=90 & <180Days] Is Null,0,[greater_than_90].[>=90 & <180Days]) AS [>=90 & <180Days], 
    IIf([greater_than_180].[>=180 Days] Is Null,0,[greater_than_180].[>=180 Days]) AS [>=180 Days] 

FROM l_section 
LEFT JOIN 
    (
     SELECT 
      since_modified.section, 
      Count(since_modified.section) AS [>=180 Days] 
     FROM 
      (
       SELECT 
        l_section.section, 
        IIf(dim_performance_score.[Modified] Is Null,0,DateDiff("d",dim_performance_score.[Modified],[compare date])) AS days_since_update 
       FROM 
        l_section 
       LEFT JOIN 
        dim_performance_score 
       ON 
        l_section.section = dim_performance_score.section 
      ) as since_modified 
     WHERE 
      (((since_modified.days_since_update)>=180)) 
     GROUP BY 
      since_modified.section 
    ) as greater_than_180 
ON 
    l_section.section = greater_than_180.section 

LEFT JOIN 
    (
     SELECT 
      since_modified.section, 
      Count(since_modified.section) AS [<90 Days] 
     FROM 
      (
       SELECT 
        l_section.section, 
        IIf(dim_performance_score.[Modified] Is Null,0,DateDiff("d",dim_performance_score.[Modified],[compare date])) AS days_since_update 
       FROM 
        l_section 
       LEFT JOIN 
        dim_performance_score 
       ON 
        l_section.section = dim_performance_score.section 
      ) as since_modified 
     WHERE 
      (((since_modified.days_since_update)<90)) 
     GROUP BY 
      since_modified.section 
    ) as less_than_90 
ON 
    l_section.section = less_than_90.section 

LEFT JOIN 
    (
     SELECT 
      since_modified.section, 
      Count(since_modified.section) AS [>=90 & <180Days] 
     FROM 
      (
       SELECT 
        l_section.section, 
        IIf(dim_performance_score.[Modified] Is Null,0,DateDiff("d",dim_performance_score.[Modified],[compare date])) AS days_since_update 
       FROM 
        l_section 
       LEFT JOIN 
        dim_performance_score 
       ON 
        l_section.section = dim_performance_score.section 
      ) as since_modified     
     WHERE 
      (((since_modified.days_since_update)>=90 
      And 
      (since_modified.days_since_update)<180)) 
     GROUP BY 
      since_modified.section 
    ) as greater_than_90 
ON 
    l_section.section = greater_than_90.section 

LEFT JOIN 
    (
     SELECT 
      l_section.section, 
      Count(IIf([section] Is Null,0,[section])) AS [Total Records] 
     FROM 
      l_section 
     LEFT JOIN 
      dim_performance_score 
     ON 
      l_section.section = dim_performance_score.section 
     GROUP BY l_section.section 
    ) as total_count 
ON 
    l_section.section = total_count.section 

ORDER BY l_section.section; 
+0

語法錯誤(缺少運營商)JOIN( SELECT since_modified.section, 計數(since_modified.section)AS [<90天] FROM (」 –

+0

我覺得每個連接是在同一水平,需要有用於轉換成零l_section和空每個部分的記錄。 –

+0

嘗試每次添加一個部分和註釋掉休息。我無法看到數據所以我只能猜測,但在結構上是我寫的是健全的。所以,只有第一個「LEFT JOIN」部分嘗試一下,看看會發生什麼。如果這樣的作品,加上下一LEFT JOIN等Ø ñ。 –

0

那麼我想出了一種獲得我想要的並且簡單得多的方法。我張貼作爲我自己的答案來顯示前後。

SELECT 

     section_last_modified.section, 
     Count(section_last_modified.section) AS [Total Records], 
     Sum(IIf([days_since_modified]<90,1,0)) AS [< 90 days], 
     Sum(IIf([days_since_modified] Between 90 And 180,1,0)) AS [>=90 and <180 days], 
     Sum(IIf([days_since_modified]>=180,1,0)) AS [>=180 days] 

FROM section_last_modified 

GROUP BY section_last_modified.section; 



-----section_last_modified------- 

PARAMETERS [Compare Date] DateTime; 
SELECT 
     dim_performance_score.section, 
     DateDiff("d",dim_performance_score.[Modified],[Compare Date]) AS days_since_modified 
FROM 
     dim_performance_score 
WHERE 
     (((dim_performance_score.[Content Type])="stacker maintenance")) 
ORDER BY 
     dim_performance_score.section; 
在查詢表達式l_section.section = greater_than_180.section LEFT