2011-08-30 60 views
1

我想重写下面的select语句没有sub选择;而它的工作原理在目前,因为它是它只有作品是否有数据,在子选择的一个不返回数据,我得到一个错误重写tsql select语句没有子选择

每个GROUP BY表达式必须包含至少一个列不是外部参考。

这是选择:

SELECT COUNT(DISTINCT (PROMSID)) AS Volume , 
      (SELECT CAST(CAST(COUNT(DISTINCT (PROMSID)) AS DECIMAL(8, 2)) 
         /(SELECT COUNT(DISTINCT RES.Branch) 
          FROM tblPROMsExportSummary AS PES 
            INNER JOIN TVF_GetRelevantScorecards(@ProcedureID, 82, @StartDate, @EndDate) AS RES ON RES.PROMSID = PES.PROMSID 
            INNER JOIN tblUploadedScorecards AS UPL ON PES.PROMSID = UPL.PEMSID 
          WHERE RES.[Month] = TVF.MonthValue 
          GROUP BY TVF.MonthValue 
         ) AS DECIMAL(8, 2)) AS PCTAverage 
       FROM  #RelevantSummaryPCT AS PCT 
       WHERE  PCT.[Month] = TVF.[MonthValue] 
       GROUP BY TVF.[MonthValue] 
      ) AS PCTAverage , 
      TVF.ShortMonth AS [Month] 
    FROM #RelevantSummary AS RS 
      RIGHT OUTER JOIN TVF_Months(@StartDate, @EndDate) AS TVF ON TVF.MonthValue = RS.[Month] 
    GROUP BY TVF.[MonthName] , 
      TVF.[MonthValue] , 
      TVF.ShortMonth , 
      TVF.DisplayOrder 
    ORDER BY TVF.DisplayOrder 

我寻找到实现是一组从存储不同级别的报告结果,2临时表的数据。 Volume列是“我的组”的结果量,PCTAverage是所有组的结果量。对于那些2临时表的选择:

SELECT DISTINCT 
      PES.FKProcedureID , 
      PES.PROMSID , 
      UPL.PKID AS UploadID , 
      MONTH(UPL.ShopDate) AS [Month] 
    INTO #RelevantSummary 
    FROM tblPROMsExportSummary AS PES 
      INNER JOIN TVF_GetRelevantScorecards(@ProcedureID, @AreaID, @StartDate, @EndDate) AS RES ON RES.PROMSID = PES.PROMSID 
      INNER JOIN tblUploadedScorecards AS UPL ON PES.PROMSID = UPL.PEMSID 

-- also get them for all PCTs, @AreaID hardcoded to 82 
    SELECT DISTINCT 
      PES.FKProcedureID , 
      PES.PROMSID , 
      UPL.PKID AS UploadID , 
      MONTH(UPL.ShopDate) AS [Month] 
    INTO #RelevantSummaryPCT 
    FROM tblPROMsExportSummary AS PES 
      INNER JOIN TVF_GetRelevantScorecards(@ProcedureID, 82, @StartDate, @EndDate) AS RES ON RES.PROMSID = PES.PROMSID 
      INNER JOIN tblUploadedScorecards AS UPL ON PES.PROMSID = UPL.PEMSID 

回答

0

使用derived tables就是我后,在上面的例子中可以这样实现:

SELECT * FROM (
SELECT DISTINCT 
     PES.FKProcedureID , 
     PES.PROMSID , 
     UPL.PKID AS UploadID , 
     MONTH(UPL.ShopDate) AS [Month] 
INTO #RelevantSummary 
FROM tblPROMsExportSummary AS PES 
     INNER JOIN TVF_GetRelevantScorecards(@ProcedureID, @AreaID, @StartDate, @EndDate) AS RES ON RES.PROMSID = PES.PROMSID 
     INNER JOIN tblUploadedScorecards AS UPL ON PES.PROMSID = UPL.PEMSID) AS T1 
INNER JOIN (

SELECT DISTINCT 
     PES.FKProcedureID , 
     PES.PROMSID , 
     UPL.PKID AS UploadID , 
     MONTH(UPL.ShopDate) AS [Month] 
INTO #RelevantSummaryPCT 
FROM tblPROMsExportSummary AS PES 
     INNER JOIN TVF_GetRelevantScorecards(@ProcedureID, 82, @StartDate, @EndDate) AS RES ON RES.PROMSID = PES.PROMSID 
     INNER JOIN tblUploadedScorecards AS UPL ON PES.PROMSID = UPL.PEMSID) AS T2 
ON T1.PROMSID = T2.PROMSID 

要直接引自4guys发布

我们正在做的是首先从派生表中获取结果集(FROM子句中的SELECT语句)。一旦我们有了结果集,就好像它本身就是一张表。然后我们在派生表上执行SELECT,返回结果!您可以在文章Obtaining Ranked Values from a Table页面的4GuysFromRolla.com上找到使用派生表的另一个示例。

虽然我最终选择看起来更像是这样的:

SELECT ISNULL(Volume, 0) AS Volume , 
      ISNULL(PCTAverage, 0) AS PCTAverage , 
      ShortMonth AS [Month] , 
      DisplayOrder 
    FROM (SELECT COUNT(DISTINCT (PROMSID)) AS Volume , 
         RS.YearMonth 
       FROM  @RelevantSummary AS RS 
       GROUP BY YearMonth) AS RS 
      INNER JOIN (SELECT CAST(CAST(COUNT(PROMSID) AS DECIMAL(8, 3)) 
           /(SELECT ISNULL(COUNT(DISTINCT RES.Branch), 1) 
            FROM tblPROMsExportSummary AS PES 
              INNER JOIN TVF_GetRelevantScorecards(@ProcedureID, @RootReportLevelID, @ReportLevelID, @StartDate, 
                       @EndDate) AS RES ON RES.PROMSID = PES.PROMSID 
              INNER JOIN tblUploadedScorecards AS UPL ON PES.PROMSID = UPL.PEMSID 
            WHERE RES.YearMonth = PCT.YearMonth 
            GROUP BY RES.YearMonth) AS DECIMAL(8, 3)) AS PCTAverage , 
           YearMonth 
         FROM @RelevantSummaryPCT AS PCT 
         GROUP BY YearMonth) AS PCT ON RS.YearMonth = PCT.YearMonth 
      RIGHT OUTER JOIN (SELECT * 
           FROM  dbo.TVF_Months(@StartDate, @EndDate)) AS TVF ON TVF.DisplayOrder = RS.YearMonth 
0

我还不如改写子查询,但根据你写的:

我想改写以下选择没有子选择的语句; 而它工作在此刻,因为它是唯一的,如果有数据的工作,当子选择的一个不返回数据,我得到一个错误

不知COALESCE能为你的问题做的伎俩。

+0

我试图用COALESCE但错误来自“GROUP BY TVF.MonthValue”上线8,当没有了加入返回匹配数据什么都没有,SQL也找不到MonthValue,所以它会查看外部语句 - 再次找不到任何要导致出现错误消息的分组。 –