Как получить% товаров по типу, используя SQL - PullRequest
2 голосов
/ 28 мая 2020

У меня есть 2 таблицы

CREATE TABLE item_color (
    item_id INTEGER,
    color VARCHAR(255)
);

CREATE TABLE item_info (
    item_id INTEGER,
    type INTEGER
);


INSERT INTO item_info (item_id, type)
VALUES
  (57510, 7),
  (57509, 7),
  (57508, 8),
  (57507, 8),
  (57506, 7),
  (57505, 7),
  (57504, 8),
  (57503, 8),
  (57501, 8),
  (57500, 8),
  (57499, 7),
  (57498, 7),
  (57497, 8);

INSERT INTO item_color (item_id, color)

VALUES
  (57510,'Red'),  (57509,'Red'),  (57508,'Green'),  (57507,'Blue'),  (57506,'Red'),  (57505,'Red'),
  (57504,'Red'),  (57503,'Green'),  (57501,'Blue'),  (57500,'Red'),  (57499,'Green'),  (57498,'Blue'),
  (57497,'Red'),  (57510,'Red'),  (57509,'Red'),  (57508,'Red'),  (57507,'Red'),  (57506,'Red'),
  (57505,'Red'),  (57504,'Red'),  (57503,'Red'),  (57501,'Blue'),  (57500,'Red'),  (57499,'Red'),
  (57498,'Red'),  (57497,'Red'),  (57510,'Green'),  (57509,'Red'),  (57508,'Red'),  (57507,'Red'),
  (57506,'Blue'),  (57505,'Red'),  (57504,'Green'),  (57503,'Red'),  (57501,'Blue'),  (57500,'Red'),
  (57499,'Red'),  (57498,'Red'),  (57497,'Red'),  (57510,'Green'),  (57509,'Green'),  (57508,'Red'),
  (57507,'Red'),  (57506,'Blue'),  (57505,'Red'),  (57504,'Green'),  (57503,'Green'),  (57501,'Blue'),
  (57500,'Blue'),  (57499,'Blue'),  (57498,'Blue'),  (57497,'Blue'),  (57510,'Red'),  (57509,'Red'),
  (57508,'Red'),  (57507,'Red'),  (57506,'Red'),  (57505,'Red'),  (57504,'Red'),  (57503,'Red'),
  (57501,'Red'),  (57500,'Red'),  (57499,'Red'),  (57498,'Red'),  (57497,'Red');

item_info

item_id type
57510   7
57509   7
57508   8
57507   8
57506   7
57505   7
57504   8
57503   8
57501   8
57500   8
57499   7
57498   7
57497   8

item_color

item_id  color
57510   "Red"
57509   "Red"
57508   "Green"
57507   "Blue"
57506   "Red"
57505   "Red"
57504   "Red"
57503   "Green"
57501   "Blue"
57500   "Red"
57499   "Green"
57498   "Blue"
57497   "Red"
57510   "Red"
57509   "Red"
57508   "Red"
57507   "Red"
57506   "Red"
57505   "Red"
57504   "Red"
57503   "Red"
57501   "Blue"
57500   "Red"
57499   "Red"
57498   "Red"
57497   "Red"
57510   "Green"
57509   "Red"
57508   "Red"
57507   "Red"
57506   "Blue"
57505   "Red"
57504   "Green"
57503   "Red"
57501   "Blue"
57500   "Red"
57499   "Red"
57498   "Red"
57497   "Red"
57510   "Green"
57509   "Green"
57508   "Red"
57507   "Red"
57506   "Blue"
57505   "Red"
57504   "Green"
57503   "Green"
57501   "Blue"
57500   "Blue"
57499   "Blue"
57498   "Blue"
57497   "Blue"
57510   "Red"
57509   "Red"
57508   "Red"
57507   "Red"
57506   "Red"
57505   "Red"
57504   "Red"
57503   "Red"
57501   "Red"
57500   "Red"
57499   "Red"
57498   "Red"
57497   "Red"

Я пытается выполнить запрос, чтобы вернуть% элементов по типу, который является зеленым или синим в элементах.

Желаемый результат

type  percent_blue_green  total_items
7         30.00               6
8         34.29               7

Я написал очень сложный запрос, чтобы получить такой вывод

SELECT subquery1.type,
       ROUND( CAST((CAST(subquery3.blue_green_colors AS FLOAT) / CAST(subquery2.total_colors AS FLOAT) * 100) AS numeric), 2) AS percent_blue_green,
       subquery1.total_items
  FROM (SELECT type,
               COUNT(item_id) AS total_items
          FROM item_info
         GROUP BY type) AS subquery1
          JOIN (SELECT type,
                       COUNT(color) AS total_colors
                  FROM item_info AS si1
                       JOIN item_color AS sal1
                         ON sal1.item_id= si1.item_id
                 GROUP BY type) AS subquery2
            ON  subquery2.type= subquery1.type
          JOIN (SELECT type,
                       COUNT(color) AS blue_green_colors
                  FROM item_info AS si2
                       JOIN item_color AS sal2
                         ON sal2.item_id= si2.item_id
                 WHERE color IN ('Blue', 'Green')
                 GROUP BY type) AS subquery3
            ON  subquery3.type= subquery1.type;

Я все еще изучаю SQL. Есть ли более простой и эффективный способ написать запрос SQL, который даст мне желаемый результат.

1 Ответ

2 голосов
/ 28 мая 2020

Это делает то, что вы хотите:

select 
    i.type,
    avg( (c.color in ('Blue', 'Green'))::int ) ratio_blue_green,
    count(distinct i.item_id) no_items
from item_info i
inner join item_color c on c.item_id = i.item_id
group by i.type

Второе значение - это значение от 0 до 1, которое представляет соотношение синего и зеленого по всем цветам типа; вы можете легко преобразовать его в проценты и отформатировать по мере необходимости (что касается меня, я считаю, что таким образом информацию легче понять).

Демо на DB Fiddle :

type |       ratio_blue_green | no_items
---: | ---------------------: | -------:
   7 | 0.30000000000000000000 |        6
   8 | 0.34285714285714285714 |        7
...