SQL: Как отобразить данные со значениями строк в качестве имен столбцов, а затем подсчитать количество раз ID для значения строки? - PullRequest
1 голос
/ 08 марта 2020

Это моя база данных и настройка скрипты:

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);

https://www.db-fiddle.com/f/5jsGYfWZ6pnzgf62Z5FA8L/0

Я думаю, что мне нужно сделать некоторое подсчет (CASE здесь) ).

Я видел кое-что о поворотах, но не уверен в этом?

Ответы [ 2 ]

0 голосов
/ 08 марта 2020

MySQL имеет удобный ярлык. Я рекомендую:

SELECT p.NAME,
       SUM(pa.PAYMENT_ID = 85) as payment_85,
       SUM(pa.PAYMENT_ID = 94) as payment_94,
       SUM(pa.PAYMENT_ID = 105) as payment_105
FROM PRODUCTS p LEFT JOIN
     PAYMENT pa
     ON p.NAME = pa.NAME
GROUP BY p.NAME;

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

SELECT pa.NAME,
       SUM(pa.PAYMENT_ID = 85) as payment_85,
       SUM(pa.PAYMENT_ID = 94) as payment_94,
       SUM(pa.PAYMENT_ID = 105) as payment_105
FROM PAYMENT pa
GROUP BY pa.NAME;
0 голосов
/ 08 марта 2020

Да, вы правы, это возможно

Я использую 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

дБ < > скрипка здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...