UNION Запрос с суммой - PullRequest
       20

UNION Запрос с суммой

0 голосов
/ 09 ноября 2018

Вот что я хотел бы сделать:

SELECT 
  TOP 25 tblTasks.Task, 
  tblTasks.Task_Status, 
  tblTasks.Award_Date, 
  tblTasks.End_Date, 
  Sum(tblPRs.Ceiling_Final) AS SumOfCeiling_Final, 
  tblTasks.Program, tblTasks.Prime, tblClient.Org_Top
FROM 
  (tblTasks INNER JOIN tblClient ON tblTasks.Task_ID = tblClient.Task_ID) 
   INNER JOIN tblPRs ON tblTasks.Task_ID = tblPRs.Task_ID
GROUP BY 
   tblTasks.Task, 
   tblTasks.Task_Status, 
   tblTasks.Award_Date, 
   tblTasks.End_Date, 
   tblTasks.Program, 
   tblTasks.Prime, tblClient.Org_Top
HAVING 
   (((tblTasks.Task_Status)="open"))

UNION

SELECT 
   TOP 25 tblTasks.Task, 
   tblTasks.Task_Status, 
   tblTasks.Award_Date, 
   tblTasks.End_Date, Sum(tblPRs.Ceiling_Final) AS SumOfCeiling_Final, 
   tblTasks.Program, 
   tblTasks.Prime, tblClient.Org_Top
FROM 
   (tblTasks INNER JOIN tblClient ON tblTasks.Task_ID = tblClient.Task_ID) 
    INNER JOIN tblPRs ON tblTasks.Task_ID = tblPRs.Task_ID
GROUP BY 
    tblTasks.Task, 
    tblTasks.Task_Status, 
    tblTasks.Award_Date, 
    tblTasks.End_Date, 
    tblTasks.Program, 
    tblTasks.Prime, 
    tblClient.Org_Top
HAVING 
    (((tblTasks.Task_Status)="pending"))

ORDER BY 
    Sum(tblPRs.Ceiling_Final) DESC;

Я ввожу SQL в MS Access. Единственная разница между двумя запросами - это значение параметра HAVING. Отдельные запросы поступили от MS Access Query Design. Каждый отдельный запрос в сочетании с оператором ORDER BY работает нормально и дает ожидаемые результаты. Когда я пытаюсь запустить их как UNION, я получаю следующую ошибку:

Выражение ORDER BY (Sum (tblPRs.Ceiling_Final)) включает поля которые не выбраны запросом. Только те поля, которые запрашиваются в первый запрос может быть включен в выражение ORDER BY.

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

Я полагаю, что одно из следующих действий выполнит то, что вам нужно после:

SELECT *
FROM (put your 1st query here
      UNION
      put your 2nd query here)
ORDER BY SumOfCeiling_Final DESC;

-или-

SELECT * FROM (put your 1st query here, and include ORDER BY Sum(tblPRs.Ceiling_Final) DESC)
UNION
SELECT * FROM (put your 2nd query here, and include ORDER BY Sum(tblPRs.Ceiling_Final) DESC)

Мой sql-fu не достаточно силен, чтобы точно знать, что это сработает, не возиться с реальными данными; Говоря о том, не могли бы вы установить SQL Fiddle с минимальной схемой и данными, чтобы проиллюстрировать ваш вопрос / проблему?

РЕДАКТИРОВАТЬ: Для записи, мне также нравится ответ @Used_By_Al Уже опубликовано, и, очевидно, его / ее ответ очень похож на мой первый вариант; используйте тот, который лучше всего подходит для ваших нужд.

0 голосов
/ 13 ноября 2018

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

SELECT *
FROM ( placed first query here including the ORDER BY
) AS a

UNION ALL

SELECT *
FROM ( placed second query here including the ORDER BY
) AS b;
0 голосов
/ 09 ноября 2018

nb: я предположил, что вы хотите только 25 строк с самым высоким SumOfCeiling_Final

Я предлагаю вам сначала сформировать «производную таблицу», используя union all, а затем искать строки top n. Обратите внимание, что having clause НЕ является заменой where clause. having clause необходимо, если условия фильтрации требуют агрегированных значений (например, having sum(cost) > 1000). Если условия фильтрации не включают агрегаты, поместите их в where clause.

SELECT TOP 25
    *
FROM (
    SELECT
        tblTasks.Task, tblTasks.Task_Status, tblTasks.Award_Date, tblTasks.End_Date, SUM(tblPRs.Ceiling_Final) AS SumOfCeiling_Final, tblTasks.Program, tblTasks.Prime, tblClient.Org_Top
    FROM (tblTasks
    INNER JOIN tblClient
        ON tblTasks.Task_ID = tblClient.Task_ID)
    INNER JOIN tblPRs
        ON tblTasks.Task_ID = tblPRs.Task_ID
    WHERE tblTasks.Task_Status = "open"
    GROUP BY
        tblTasks.Task
       ,tblTasks.Task_Status
       ,tblTasks.Award_Date
       ,tblTasks.End_Date
       ,tblTasks.Program
       ,tblTasks.Prime
       ,tblClient.Org_Top

    UNION ALL

    SELECT
        tblTasks.Task, tblTasks.Task_Status, tblTasks.Award_Date, tblTasks.End_Date, SUM(tblPRs.Ceiling_Final) AS SumOfCeiling_Final, tblTasks.Program, tblTasks.Prime, tblClient.Org_Top
    FROM (tblTasks
    INNER JOIN tblClient
        ON tblTasks.Task_ID = tblClient.Task_ID)
    INNER JOIN tblPRs
        ON tblTasks.Task_ID = tblPRs.Task_ID
    WHERE tblTasks.Task_Status = "pending"
    GROUP BY
        tblTasks.Task
       ,tblTasks.Task_Status
       ,tblTasks.Award_Date
       ,tblTasks.End_Date
       ,tblTasks.Program
       ,tblTasks.Prime
       ,tblClient.Org_Top
    ) d
ORDER BY
    SumOfCeiling_Final DESC
;

NB UNION ALL НЕ удаляет дублирующиеся строки, UNION удаляет дублирующиеся строки. Итак, UNION ALL на самом деле МЕНЬШЕ работает, то есть быстрее. Кроме того, в верхнем запросе все строки должны содержать Task_Status = "open", а в нижнем они должны содержать Task_Status = "pending", чтобы 2 запроса производили строки, которые должны отличаться. Хотя без данных для проверки я не могу быть уверен, похоже, вам нужно всего лишь использовать union all.

...