【问题标题】:How to get the % of items by type using SQL如何使用 SQL 按类型获取项目的百分比
【发布时间】:2020-09-15 06:36:38
【问题描述】:

我有两张桌子

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 查询来获得所需的输出。

【问题讨论】:

  • 能否请您发布构建数据库的代码?
  • 所以一个给定的项目可能有不止一种颜色?您应该提供有关计算规则的更多详细信息。
  • @bhristov 我添加了查询以创建表。
  • @GMB 每个项目 ID 都是唯一的,并且存在于两个表中,并且给定项目可以有多个颜色。我只想看看蓝色和绿色在 2 种类型 (7,8) 的总颜色中所占的百分比

标签: sql postgresql join count window-functions


【解决方案1】:

这就是你想要的:

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 之间的值,表示蓝色和绿色在该类型的所有颜色中的 比率;您可以轻松地将其转换为百分比并根据需要对其进行格式化(对我而言,我发现这样的信息更容易理解)。

Demo on DB Fiddle

类型 | ratio_blue_green |没有项目 ---: | ---------------------: | --------: 7 | 0.30000000000000000000 | 6 8 | 0.34285714285714285714 | 7

【讨论】:

  • 这太棒了。对此,我真的非常感激。我试图了解第 3 行中“::int”的用法。你能向我解释一下该行的作用吗?谢谢:-)
  • @Sharath:成功时将条件评估为1,否则评估为0。取这个平均值可以得到满足条件的行的比率。
猜你喜欢
  • 1970-01-01
  • 2022-12-05
  • 2019-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多