Да, вы правы, это возможно
Я использую IF, если есть только одна опция.
SELECT
p.NAME
,SUM(IF(PAYMENT_ID = 85,1,0)) '85'
,SUM(IF(PAYMENT_ID = 94,1,0)) '94'
,SUM(IF(PAYMENT_ID = 105,1,0)) '105'
FROM PRODUCTS p LEFT JOIN PAYMENT pa ON p.NAME = pa.NAME
GROUP BY p.NAME;
Там Ссылка между двумя таблицами должна быть идентификатором, а не имя, имя может быть уникальным, но цифры должны занимать меньше места, чем текст.
CREATE TABLE PRODUCTS (
NAME varchar(20),
PRODUCT_ID int(3)
);
CREATE TABLE PAYMENT (
NAME varchar(20),
PAYMENT_ID int(4)
);
INSERT INTO PRODUCTS (NAME, PRODUCT_ID)
VALUES
("Apple", 1),
("Banana", 2),
("Watermelon", 3),
("Bread", 4),
("Milk", 5),
("Cake", 6),
("Candy", 7),
("Butter", 8),
("Carrot", 9),
("Tomato", 10);
INSERT INTO PAYMENT (NAME, PAYMENT_ID)
VALUES
("Banana", 85),
("Apple", 94),
("Banana", 94),
("Candy", 85),
("Banana", 105);
✓
✓
✓
✓
SELECT
p.NAME
,SUM(IF(PAYMENT_ID = 85,1,0)) '85'
,SUM(IF(PAYMENT_ID = 94,1,0)) '94'
,SUM(IF(PAYMENT_ID = 105,1,0)) '105'
FROM PRODUCTS p LEFT JOIN PAYMENT pa ON p.NAME = pa.NAME
GROUP BY p.NAME;
NAME | 85 | 94 | 105
:--------- | -: | -: | --:
Apple | 0 | 1 | 0
Banana | 1 | 1 | 1
Bread | 0 | 0 | 0
Butter | 0 | 0 | 0
Cake | 0 | 0 | 0
Candy | 1 | 0 | 0
Carrot | 0 | 0 | 0
Milk | 0 | 0 | 0
Tomato | 0 | 0 | 0
Watermelon | 0 | 0 | 0
дБ < > скрипка здесь