Добавление объединения в запрос count () - PullRequest
0 голосов
/ 14 марта 2011

У меня следующий код взят из моего предыдущего вопроса здесь и немного изменился.

SELECT *
FROM ES_TOOL
  INNER JOIN ES_HARDWARE ON ES_HARDWARE.eshw_ID = ES_TOOL.ESTOOL_HARDWARE 
  INNER JOIN ES_PAYMENT  on ES_payment.espay_id = es_TOOL.estool_payment 

  LEFT JOIN (
    SELECT
      tchap.estch_tool, tfacet.estfa_tool,
      count(marks.esmrk_value) AmtMarks 
    FROM ES_MARK marks 
      left Join ES_TOOL_FACET tfacet ON marks.esmark_tool_facet = tfacet.estfa_id --line added
      left Join ES_TOOL_CHAPTER tchap ON marks.esmark_tool_chapter = tchap.estch_id 
    GROUP BY tchap.estch_tool 
  ) h  ON ES_TOOL.estool_id = h.estch_tool

Я пытаюсь добавить дополнительное объединение в попытке получить оценкусчитать от "отметок", которые удовлетворяют любому из левых критериев включения "ON".Без дополнительной строки запрос выполняется, но не учитывает отметки, соответствующие критерию «фасет».При этом я получаю следующую ошибку:

Сообщение 8120, Уровень 16, Состояние 1, Строка 1

Столбец ES_TOOL_FACET.estfa_tool недопустим в списке выбора, поскольку он несодержится либо в статистической функции, либо в предложении GROUP BY.

Любая помощь приветствуется.

Ответы [ 4 ]

1 голос
/ 14 марта 2011

Это должно быть очевидно в вашем внутреннем запросе:

SELECT  tchap.estch_tool, tfacet.estfa_tool,  count(marks.esmrk_value) AmtMarks 
FROM ES_MARK marks 
  left Join ES_TOOL_FACET tfacet ON marks.esmark_tool_facet = tfacet.estfa_id --line added
  left Join ES_TOOL_CHAPTER tchap ON marks.esmark_tool_chapter = tchap.estch_id 
GROUP BY tchap.estch_tool 

у вас есть три выбранных столбца, estch_tool, который находится в предложении GROUP BY, esmrk_value, который находится в статистической функции,и estfa_tool, который отсутствует ни в предложении GROUP BY, ни в статистической функции.

Ваше решение должно быть либо:

  1. GROUP BY tchap.estch_tool, tfacet.estfa_tool
  2. AVG(tfacet.estfa_tool) или любая агрегатная функция
1 голос
/ 14 марта 2011

В этом запросе есть синтаксическая ошибка -

SELECT  
            tchap.estch_tool, 
            tfacet.estfa_tool,  
            count(marks.esmrk_value) AmtMarks 
        FROM ES_MARK marks   
            left Join ES_TOOL_FACET tfacet ON 
                marks.esmark_tool_facet = tfacet.estfa_id --line added  
            left Join ES_TOOL_CHAPTER tchap ON 
                marks.esmark_tool_chapter = tchap.estch_id  
        GROUP BY tchap.estch_tool  

GROUP BY требует, чтобы любой столбец, появляющийся в списке SELECT, был либо агрегирован, либо отображался в предложении GROUP BY.

Поэтому поместите агрегатную функцию - MIN, MAX, SUM, AVG и т. Д. В tfacet.estfa_tool, потому что она не появляется в предложении group by или не включает ее там.

1 голос
/ 14 марта 2011

Сообщение об ошибке означает, что ES_TOOL_FACET.estfa_tool должен быть включен в Group By.

При использовании Group By все неагрегированные столбцы должны включаться в группу по разделам.

0 голосов
/ 14 марта 2011

Мое решение поставляется в двух вариантах.Какой из них лучше подходит вам, может зависеть от того, какой из них даст лучший план выполнения при проверке ваших данных.

Описание варианта # 1 : (В обоих случаях я описываю только логикуза основным подвыбором SELECT LEFT JOIN фактически заменяется часть, но сценарии идут как полные запросы, эквивалентные вашим:

  1. Извлечение и объединение всех элементов из обеих таблиц tools.
  2. Соединить список с таблицей marks соответственно.
  3. Группировать набор результатов по элементам инструмента и получить значения.

Запрос:

SELECT *
FROM ES_TOOL
  INNER JOIN ES_HARDWARE ON ES_HARDWARE.eshw_ID = ES_TOOL.ESTOOL_HARDWARE 
  INNER JOIN ES_PAYMENT  on ES_payment.espay_id = es_TOOL.estool_payment 

  LEFT JOIN (
    SELECT
      tools.tool,
      COUNT(*) AS AmtMarks
    FROM (
      SELECT 'tchap'  AS tbl, estch_id AS id, estch_tool AS tool
      FROM ES_TOOL_CHAPTER

      UNION ALL

      SELECT 'tfacet' AS tbl, estfa_id AS id, estfa_tool AS tool
      FROM ES_TOOL_FACET
    ) tools
      INNER JOIN ES_MARK marks
        ON tools.tbl = 'tchap'  AND tools.id = marks.esmark_tool_chapter
        OR tools.tbl = 'tfacet' AND tools.id = marks.esmark_tool_facet
    GROUP BY tools.tool
  ) h ON ES_TOOL.estool_id = h.tool

Вариант # 2 :

  1. Соедините ES_TOOL_CHAPTER против marks и получите все значения estch_tool, включая дубликаты.
  2. Аналогично, объедините ES_TOOL_FACET против marks и получите все значения estfa_tool, включая дубликаты.
  3. UNION ALL обоих наборов.
  4. Группируйте полученный набор по инструментам иполучить счет.

И запрос:

SELECT *
FROM ES_TOOL
  INNER JOIN ES_HARDWARE ON ES_HARDWARE.eshw_ID = ES_TOOL.ESTOOL_HARDWARE 
  INNER JOIN ES_PAYMENT  on ES_payment.espay_id = es_TOOL.estool_payment 

  LEFT JOIN (
    SELECT
      tools.tool,
      COUNT(*) AS AmtMarks
    FROM (
      SELECT estch_tool AS tool
      FROM ES_TOOL_CHAPTER tools
        INNER JOIN ES_MARK marks ON tools.estch_id = marks.esmark_tool_chapter

      UNION ALL

      SELECT estfa_tool AS tool
      FROM ES_TOOL_FACET tools
        INNER JOIN ES_MARK marks ON tools.estfa_id = marks.esmark_tool_facet
    ) tools
    GROUP BY tools.tool
  ) h ON ES_TOOL.estool_id = h.tool
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...