2017-01-25 4 views
-1

У меня есть следующий запрос, который отлично работает, когда я выбираю один столбец, но мне нужно выбрать 2 столбца во всех моих предложениях выбора, и у меня нет идеи, почему она не работает. Любая идея, как я могу заставить его работать, пожалуйста?Присоединиться к 3 таблицам mysql

SELECT (select count(distinct P.ProductID), SUM(Sales.XX) 
     from Product P 
     LEFT JOIN Product_Classification PC 
     ON P.ProductID = PC.ProductID 
     LEFT JOIN Classification C 
     ON PC.ClassificationID = C.ClassificationID, Sales 
     where P.ProductID = Sales.ProductIDS and Sales.XX = 'COOKIES' 
     and C.Classification_Number IN ('1.5101','45565')) AS first_clause, 

(select count(distinct P1.ProductID), SUM(Sales.XX) 
     from Product P1 
     LEFT JOIN Product_Classification PC 
     ON P1.ProductID = PC.ProductID 
     LEFT JOIN Classification C 
     ON PC.ClassificationID = C.ClassificationID, Sales 
     where P1.ProductID = Sales.ProductIDS and Sales.XX = 'COOKIES' 
     and C.Classification_Number ='1.00') AS second_clause, 
(
select count(distinct P.ProductID), SUM(Sales.XX) 
     from Product P 
     LEFT JOIN Product_Classification PC 
     ON P.ProductID = PC.ProductID 
     LEFT JOIN Classification C 
     ON PC.ClassificationID = C.ClassificationID, Sales 
     where P.ProductID = Sales.ProductIDS and Sales.XX = 'COOKIES' 
     and C.Classification_Number ='1.5101') AS third_clause; 
+0

Не могли бы вы [изменить] ваш вопрос, чтобы уточнить? Вы говорите, что вы выбираете один столбец. Но ваш оператор SELECT, кажется, выбирает три столбца, все из которых генерируются агрегатами. –

+0

См. Http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql- query – Strawberry

+0

@ O.Jones Я хочу выбрать 2 столбца ('count (different P.ProductID), SUM (Sales.XX)' в каждом из моих избранных – Bobby

ответ

0

Этот подзапрос сочетает в себе старинный и новый стиль соединения.

 select count(distinct P.ProductID), SUM(Sales.XX) 
      from Product P 
    LEFT JOIN Product_Classification PC ON P.ProductID = PC.ProductID 
    LEFT JOIN Classification C ON PC.ClassificationID = C.ClassificationID, 
       Sales /* !!! comma join !!! */ 
    where P.ProductID = Sales.ProductIDS and Sales.XX = 'COOKIES' 

Старый стиль (стиль запятой 1990-х годов) является устаревшим по действительно веской причине. И смешивание стилей? Нет, просто нет. Начнем с того, что переработаем это, когда все новые стили объединяются.

Затем давайте превратим его в надлежащую операцию GROUP BY.

 select C.Classification_Number, 
       COUNT(distinct P.ProductID) Product_Count, 
       SUM(Sales.XX) Sales_Sum 
      from Product P 
    LEFT JOIN Product_Classification PC ON P.ProductID = PC.ProductID 
    LEFT JOIN Classification C ON PC.ClassificationID = C.ClassificationID, 
    INNER JOIN Sales ON P.ProductID = Sales.ProductIDS 
     WHERE Sales.XX = 'COOKIES' 
     GROUP BY C.Classification_Number 

Попробуйте этот запрос.

Затем вы можете использовать это, чтобы извлечь свои данные по классификации.

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

Поворот (как вы случайно обнаружили) колоссальную боль в шее в MySQL. Лучше всего сделать это в каком-то клиентском программном пакете (php? Java?). Если вы должны сделать это в MySQL, это будет выглядеть примерно так.

SELECT 
    SUM(CASE WHEN Class IN ('1.5101','45565') THEN Product_Count ELSE 0 END) ap, 
    SUM(CASE WHEN Class IN ('1.5101','45565') THEN Sales_Sum  ELSE 0 END) as, 
    SUM(CASE WHEN Class = '1.00'    THEN Product_Count ELSE 0 END) bp, 
    SUM(CASE WHEN Class = '1.00'    THEN Sales_Sum  ELSE 0 END) bs, 
    SUM(CASE WHEN Class = '1.501'    THEN Product_Count ELSE 0 END) cp, 
    SUM(CASE WHEN Class = '1.501'    THEN Sales_Sum  ELSE 0 END) cs 
FROM (
      select C.Classification_Number Class, 
        COUNT(distinct P.ProductID) Product_Count, 
        SUM(Sales.XX) Sales_Sum 
       from Product P 
     LEFT JOIN Product_Classification PC ON P.ProductID = PC.ProductID 
     LEFT JOIN Classification C ON PC.ClassificationID = C.ClassificationID, 
     INNER JOIN Sales ON P.ProductID = Sales.ProductIDS 
      WHERE Sales.XX = 'COOKIES' 
      GROUP BY C.Classification_Number 
    ) aggregate 

Обратите внимание, в этом поворотном запросе, как вся совокупность запросов используется здесь в качестве подзапроса, и CASE WHEN ... THEN ... ELSE 0 END положения используются вытаскивать значения для категорий, которые вы хотите суммируется.

Чтобы получить эту работу: сначала выполните общий запрос. Убедитесь, что вы считаете, что это правильно. Затем заверните его в поворот.

+0

. При выборе 'C.Classification_Number' мой запрос вернет много строк, но все, что мне действительно нужно, это одна строка, содержащая' COUNT' и 'SUM'. Хотя это не упоминается , этот 'C.Classification_Number IN ('1.5101', '45565')' фактически будет содержать более 200 номеров – Bobby

Смежные вопросы