Mysql, Динамический запрос для строк в столбец

0

У меня три таблицы с именем employee, employee_products, product_type

Изображение 174551

ссылка: http://sqlfiddle.com/#!9/00436/4

Я пытаюсь получить данные как Let this table Table_1

используя этот запрос:

select emp.name, 
(select count(*) from employee_products where product_type_id = 1 and employee_id = emp.id) as Service,
(select count(*) from employee_products where product_type_id = 2 and employee_id = emp.id) as Product,
(select count(*) from employee_products where product_type_id = 3 and employee_id = emp.id) as Other
from employee as emp;

но, я думаю, что это неэффективно, и из каждого нового product_type_id я должен изменить этот запрос, могу ли я сделать это динамически.

+------------+---------+---------+-------+--+
| Name       | Service | Product | Other |  |
+------------+---------+---------+-------+--+
| Bezos      | 1       | 0       | 0     |  |
+------------+---------+---------+-------+--+
| Steve      | 0       | 3       | 0     |  |
+------------+---------+---------+-------+--+
| Bill gates | 1       | 0       | 0     |  |
+------------+---------+---------+-------+--+
| Tim Cook   | 0       | 0       | 1     |  |
+------------+---------+---------+-------+--+

и пусть эта таблица Table_2

В этом я не могу понять, как это возможно даже в mysql, поскольку в mysql отсутствует функция поворота.

+------------+---------+---------+---------+---------+-----------+-------+
| Name       | Amazon  | iPhone  | iPad    | iPod    | Microsoft | IDK   |
+------------+---------+---------+---------+---------+-----------+-------+
| Bezos      | Service | NULL    | NULL    | NULL    | NULL      | NULL  |
+------------+---------+---------+---------+---------+-----------+-------+
| Steve      | NULL    | Product | Product | Product | NULL      | NULL  |
+------------+---------+---------+---------+---------+-----------+-------+
| Bill gates | NULL    | NULL    | NULL    | NULL    | PRODUCT   | NULL  |
+------------+---------+---------+---------+---------+-----------+-------+
| Tim Cook   | NULL    | NULL    | NULL    | NULL    | NULL      | OTHER |
+------------+---------+---------+---------+---------+-----------+-------+

Пожалуйста помоги.

Примечание. В таблице product_type, employee_products может быть более 100 элементов.

Теги:
performance
pivot-table

2 ответа

0

Существует несколько бит кода для динамического построения и запуска SELECT с динамически выводимыми столбцами. Вот моя.

0

Попробуйте это для Table_1

Select name, Max(Service) as Service, Max(Product) as Product, Max(Other) as Other
From (
    select e.name, 
            count(case when ep.product_type_id = 1 then 1 else null end) as Service,
            count(case when ep.product_type_id = 2 then 1 else null end) as Product,
            count(case when ep.product_type_id = 3 then 1 else null end) as Other,
    from employee e 
            inner join employee_products ep on (e.id = ep.employee_id)
)
Group by name;

Примечание. То же самое можно попробовать для Table_2

  • 0
    Спасибо за быстрый ответ, что, если там есть больше чем 100 пунктов в таблице product_type, employee_products.
  • 0
    Вы хотите 100 столбец + имя столбца?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню