2016-01-03 2 views
0

У меня есть структура данных в таблице из этих колонокSQL Select Количество категорий accross несколько столбцов

ID | Title | Category_level_1 | Category_level_2 | Category_level_3 
1 | offer 1 | Browns   | Greens   | White 
2 | offer 1 | Browns   | White   | 
3 | offer 2 | Greens   | Yellow   |  
4 | offer 3 | Browns   | Greens   |  
5 | offer 4 | Browns   | Yellow   | White  

Не имея возможности изменить структуру таблицы мне нужно «посчитать количество для объявления в категории по всему 3 столбца "

Есть также столбцы для диапазона дат предложения, чтобы ограничить текущие, но я хочу сначала выполнить запрос.

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

Предложение может быть в таблице более одного раза.

Насколько я понял, это временная таблица с UNION.

CREATE TEMPORARY TABLE IF NOT EXISTS Cats AS 
(SELECT DISTINCT(opt) FROM (
    SELECT Category_level_1 AS opt FROM a_table 
    UNION 
    SELECT Category_level_2 AS opt FROM a_table 
    UNION 
    SELECT Category_level_3 AS opt FROM a_table 
) AS Temp 
) ; 


    SELECT 
    Cats.opt AS "Joint Cat", 
    (
     SELECT count(*) 
     FROM a_table 
     WHERE a_table.`Category_level_1` = Cats.opt 
     OR a_table.`Category_level_2` = Cats.opt 
     OR a_table.`Category_level_3` = Cats.opt 
     GROUP BY a_table.Title 
    ) As Total 
    FROM Cats 
     WHERE Category_level_1 != '' 
     ORDER BY Category_level_1 ASC; 

ВОПРОС: а), так что объединение работает хорошо, и я получаю мои ценности. DONE b) Подзаголовок Total, хотя и не группируется правильно. Мне просто нужно подсчитать количество всех возвращенных строк, но оно группируется с подсчетом заголовков строк не всех строк.

Так, пытаясь понять, как понять это должно работать и SQL может быть совершенно иной с ответом:

Joint Category | Total Count of offers 
    Browns   | 3 
    White   | 3 
    Greens   | 2 
    Yellow   | 2 
+0

Я смущен.Почему коричневые и белые имеют счет 3, но зелень имеет счет 2? –

+0

Как предложение может иметь несколько раундов, но подсчитывается один раз для всех – tristanbailey

ответ

1

план

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

запроса

select `Joint Category`, count(*) as `Total Count of offers` 
from 
(
    select Title, Category_level_1 as `Joint Category` 
    from a_table 
    union 
    select Title, Category_level_2 
    from a_table 
    union 
    select Title, Category_level_3 
    from a_table 
) allcats 
where `Joint Category` is not null 
and `Joint Category` <> '' 
group by `Joint Category` 
; 

выходного

+----------------+-----------------------+ 
| Joint Category | Total Count of offers | 
+----------------+-----------------------+ 
| Browns   |      3 | 
| Greens   |      3 | 
| White   |      2 | 
| Yellow   |      2 | 
+----------------+-----------------------+ 

sqlfiddle

+0

Спасибо @amdixon, я работаю на основе вашего sql, странно, чтобы проверить его. Я запускал только 3xUNION, и он возвращал только часть данных в col 2, если Category_level_1 имеет «как» vs Category_level_2. Когда я запускал все это вместе, он правильно объединил 3. Должна быть ошибка mysql – tristanbailey

+0

Единственный союз, который принимает только уникальные записи, объединение все дает все отчетливые записи .. но для этого конкретного выхода для работы он должен использовать union – amdixon

1

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

Я был бы склонен подойти к этому, используя union all, а затем использовать count() или count(distinct), в зависимости от того, что такое логика подсчета. Для комбинации уровня и категории:

SELECT cat, COUNT(DISTINCT level, title) as numtitles 
FROM ((SELECT title, 1 as level, category_level1 as cat FROM a_table) union all 
     (SELECT title, 2 as level, category_level2 as cat FROM a_table) union all 
     (SELECT title, 3 as level, category_level3 as cat FROM a_table) 
    ) tc 
WHERE cat is not null 
GROUP BY cat; 

Вы можете включить столбец даты в каждом из подзапросов, а затем включить условие в предложении WHERE.

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