Сумма запроса на объединение - PullRequest
5 голосов
/ 10 апреля 2011

Я использую Microsoft SQL Svr Mgmt Studio 2008. У меня нет доступа к созданию временной таблицы (компания ограничивает возможность создания или изменения таблиц), или я бы использовал это для решения этой проблемы.

Я успешно использовал объединенный запрос, чтобы объединить результаты трех выбранных запросов.Сейчас я пытаюсь подвести итоги союза.

Когда я выполняю запрос ниже, я получаю:

Incorrect syntax near the keyword 'GROUP'

И затем, когда я удаляю группу, я получаю:

Incorrect syntax near ')'

Вот мой запрос на данный момент:

Select Period, PCC, SUM(BasicHits), SUM(FareHits), SUM(SearchHits)
From (

SELECT     AAAPeriod AS Period, 
AAAFromPCC AS PCC, 
- SUM(AAABasic) AS BasicHits,
- SUM(AAAFare) AS FareHits,
- SUM(AAASearch) AS SearchHits
FROM        HitsAaa
HAVING     (AAAPeriod = N'2010-10') 

UNION ALL

SELECT     AAAPeriod, 
AAAtoPCC,
SUM(AAABasic),
SUM(AAAFare),
SUM(AAASearch) 
FROM        HitsAaa
HAVING     (AAAPeriod = N'2010-10')

UNION ALL

SELECT      AgtPeriod, 
AgtPcc, 
SUM(AgtBasic),
SUM(AgtFare),
SUM(AgtSearch)
FROM          HitsAgent
HAVING      (AgtPeriod = N'2010-10')

)GROUP BY Period, PCC

Мне не удалось найти решение этой проблемы ни по одному из предыдущих вопросов.

Ответы [ 4 ]

6 голосов
/ 10 апреля 2011

Вам необходимо создать псевдоним вашей производной таблицы, вы также должны использовать группу с предложением has.

SELECT
  q1.Period, 
  q1.PCC, 
  SUM(q1.BasicHits), 
  SUM(q1.FareHits), 
  SUM(q1.SearchHits)
FROM (SELECT     
        AAAPeriod AS Period, 
        AAAFromPCC AS PCC, 
        - SUM(AAABasic) AS BasicHits,
        - SUM(AAAFare) AS FareHits,
        - SUM(AAASearch) AS SearchHits
      FROM HitsAaa
      GROUP BY 
        AAAPeriod, 
        AAAFromPCC
      HAVING (AAAPeriod = N'2010-10') 

      UNION ALL

      SELECT     
        AAAPeriod AS Period, 
        AAAtoPCC AS PCC,
        SUM(AAABasic) AS BasicHits,
        SUM(AAAFare) AS FareHits,
        SUM(AAASearch) AS SearchHits 
      FROM HitsAaa
      GROUP BY 
        AAAPeriod, 
        AAAtoPCC
      HAVING (AAAPeriod = N'2010-10')

      UNION ALL

      SELECT
        AgtPeriod AS Period, 
        AgtPcc AS PCC, 
        SUM(AgtBasic) AS BasicHits,
        SUM(AgtFare) AS FareHits,
        SUM(AgtSearch)  AS SearchHits
      FROM HitsAgent
      GROUP BY 
        AgtPeriod, 
        AgtPCC
      HAVING (AgtPeriod = N'2010-10')) q1 
GROUP BY 
  q1.Period, 
  q1.PCC
5 голосов
/ 10 апреля 2011

SQL Server требует, чтобы вы определили псевдоним таблицы для производной таблицы / встроенного представления:

SELECT x.period, x.pcc, SUM(x.BasicHits), SUM(x.FareHits), SUM(x.SearchHits)
  FROM (SELECT AAAPeriod AS Period, 
               AAAFromPCC AS PCC, 
               - SUM(AAABasic) AS BasicHits,
               - SUM(AAAFare) AS FareHits,
               - SUM(AAASearch) AS SearchHits
          FROM HitsAaa
         WHERE AAAPeriod = N'2010-10'
      GROUP BY aaaperiod, aaafrompcc
        UNION ALL
        SELECT AAAPeriod, 
               AAAtoPCC,
               SUM(AAABasic),
               SUM(AAAFare),
               SUM(AAASearch) 
          FROM HitsAaa
         WHERE AAAPeriod = N'2010-10'
      GROUP BY aaaperiod, aaafrompcc
        UNION ALL
        SELECT AgtPeriod, 
               AgtPcc, 
               SUM(AgtBasic),
               SUM(AgtFare),
               SUM(AgtSearch)
          FROM HitsAgent
         WHERE AgtPeriod = N'2010-10'
      GROUP BY agtperiod, agtpcc) AS x
GROUP BY x.period, x.pcc
2 голосов
/ 10 апреля 2011

Измените свою первую строку на

Select T.Period, T.PCC, SUM(T.BasicHits), SUM(T.FareHits), SUM(T.SearchHits)

и последняя строка

) T GROUP BY T.Period, T.PCC

Вам необходимо определить псевдоним таблицы (в данном случае T) для внутренних таблиц

Кроме того, вам нужно GROUP BY внутренние запросы

2 голосов
/ 10 апреля 2011

У меня нет доступа к созданию временной таблицы (компания ограничивает возможность создания или изменения таблиц), или я бы использовал это для решения этой проблемы.

Вместо временнойtable, попробуйте использовать переменную таблицы:

declare @t table (id int primary key, col1 varchar(50))
insert @t (col1) values ('hello table variable')
select * from @t

Переменная таблицы может делать большинство вещей, которые может делать временная таблица.

Как и в случае ответа Мартина (теперь удаленного), рассмотрите возможность подзапросапсевдоним, например:

select  ... list of columns ...
from    (
        ... subquery ...
        ) as SubQueryAlias
group by
        col1

А в вашем подзапросе having, вероятно, должен быть where:

...
FROM        HitsAaa
WHERE       (AAAPeriod = N'2010-10') 
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...