Переписать оператор выбора tsql без вложенных операций выбора - PullRequest
1 голос
/ 30 августа 2011

Я хотел бы переписать следующий оператор выбора без подвыборов;пока он работает в данный момент, как есть только работает, если есть данные, когда один из вспомогательных элементов не возвращает данные, я получаю ошибку

Каждое выражение 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

Ответы [ 2 ]

0 голосов
/ 22 марта 2012

Использование производных таблиц - это то, что я хотел, в приведенном выше примере это может быть достигнуто следующим образом:

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

Сначала мы получаем набор результатов из нашей производной таблицы (оператор SELECT в предложении FROM). Как только мы получим этот набор результатов, это будет как если бы это была сама по себе таблица. Затем мы выполняем SELECT для производной таблицы, возвращая наши результаты! Вы можете найти другой пример использования производных таблиц здесь на 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 голосов
/ 30 августа 2011

Я не так хорош, чтобы переписать подзапросы, но на основе того, что вы написали:

Я хотел бы переписать следующий оператор выбора без подвыборов; в то время как он работает в данный момент, поскольку он работает, только если есть данные, когда один из вспомогательных элементов не возвращает данные, я получаю ошибку

Интересно, может ли COALESCE решить твою проблему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...