【问题标题】:Joining two tables to count and list and sort连接两个表以计数、列出和排序
【发布时间】:2015-10-13 23:16:21
【问题描述】:

表 1:关键字

ItemID  KWtype   KWvalue

1       Brand     Nike
2       Brand     Nike
1       Type      Soccer
4       Brand     adidas

表 2:项目

ItemID  SiteID  CategoryID  ItemName

1        0         10         Shoe1
2        0         10         Shoe2
3        2         55         Shoe3
4        1         11         Shoe4

我有这两张桌子(当然要大很多)

如何继续了解 Site = 0 和 Category = 10 中出现次数最多的 10 个品牌? 我想在一列中列出前 10 名(前 10 名出现的品牌),在另一列中我想计算它们出现的次数

谢谢

【问题讨论】:

  • 您使用的是哪个数据库?
  • 到目前为止你写了什么?
  • 这是 Teradata,我是 SQL 的血腥初学者,所以我写了很多...

标签: mysql sql oracle teradata


【解决方案1】:

首先,您应该真正调整您的数据模型。这样会更有效率,也更容易理解

表格:品牌

ID  ItemID  BrandName

 1       1  Nike
 2       2  Nike
 3       4  adidas

表格:类型

ID  ItemID  TypeName

 1       1  Soccer

表格:项目

ID  SiteID  CategoryID  ItemName

 1       0          10  Shoe1
 2       0          10  Shoe2
 3       2          55  Shoe3
 4       1          11  Shoe4

构建外键以将brands and types 表中的ItemID 链接到items 表中的ID。

然后你可以运行这样的查询

SELECT brandname as Brand, count(brand.id) as Qty
FROM brands
LEFT JOIN items ON items.id = brand.itemid
WHERE siteID = 0 AND categoryID = 10
GROUP BY brandname
ORDER BY qty DESC
LIMIT 10

【讨论】:

  • 您好,我加入了一家公司,数据模型中我无法更改任何内容:)
【解决方案2】:

这将进行计数:

SELECT k.KWvalue as Brand, count(*) as Qty
 FROM items as i
 JOIN keywords as k
   ON i.itemid = k.itemid
WHERE k. KWtype = Brand
  AND i.siteID = 0
  AND i.categoryID = 10
GROUP BY k.KWvalue

返回前 10 个计数取决于您的 DBMS。

Darren H 已经为 mysql 写好了,简单添加

ORDER BY qty DESC
LIMIT 10

Teradata:

SELECT k.KWvalue as Brand, count(*) as Qty
 FROM items as i
 JOIN keywords as k
   ON i.itemid = k.itemid
WHERE k. KWtype = Brand
  AND i.siteID = 0
  AND i.categoryID = 10
GROUP BY k.KWvalue
QUALIFY RANK() OVER (ORDER BY Qty DESC) <= 10

Oracle(和大多数其他 DBMS):

SELECT Brand, Qty
FROM
 (
   SELECT k.KWvalue AS Brand, COUNT(*) AS Qty, RANK() OVER (ORDER BY Qty DESC) AS rnk
    FROM items AS i
    JOIN keywords AS k
      ON i.itemid = k.itemid
   WHERE k. KWtype = Brand
     AND i.siteID = 0
     AND i.categoryID = 10
   GROUP BY k.KWvalue
 ) dt 
WHERE rnk <= 10

【讨论】:

  • 谢谢,回到办公室会试试这个:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多