如何分组计数并加入续集?

时间:2012-09-19 21:43:06

标签: sql sequel

我查看了所有文档,我在Sequel中将此查询放在一起时遇到了问题。

select a.*, IFNULL(b.cnt, 0) as cnt FROM a LEFT OUTER JOIN (select a_id, count(*) as cnt from b group by a_id) as b ON b.a_id = a.id ORDER BY cnt

将表A视为产品,表B是指示A已购买的记录。

到目前为止,我有:

A.left_outer_join(B.group_and_count(:a_id), a_id: :id).order(:count)

基本上我只是想对表B进行分组和计数,用A加入它,但由于B不一定有A的任何记录而我用B中的数字对它进行排序,我需要默认一个值。 / p>

2 个答案:

答案 0 :(得分:2)

DB[:a].
  left_outer_join(DB[:b].group_and_count(:a_id).as(:b), :a_id=>:id).
  order(:cnt).
  select_all(:a).
  select_more{IFNULL(:b__cnt, 0).as(:cnt)}

答案 1 :(得分:-2)

我可以用MS SQL语法帮助你。

假设您的表格是产品和订单。

CREATE TABLE Product (
  Id INT NOT NULL,
  NAME VARCHAR(100) NOT NULL)

CREATE TABLE [Order] (
  Id INT NOT NULL,
  ProductId INT)

INSERT INTO Product (Id, Name) VALUES
(1, 'Tea'), (2, 'Coffee'), (3, 'Hot Chocolate')

INSERT INTO [Order] (Id, ProductId) VALUES
(1, 1), (2, 1), (3, 1), (4, 2)

此查询将提供每个产品的订单数量,包括没有订单的订单数量。

SELECT p.Id AS ProductId,
       p.Name AS ProductName,
       COUNT(o.Id) AS Orders
FROM Product p 
         LEFT OUTER JOIN [Order] o
           ON p.Id = o.ProductId
GROUP BY
       p.Id,
       p.Name
ORDER BY
       COUNT(o.Id) DESC