group + count使用不同的列类型

时间:2017-04-13 16:01:20

标签: sql ruby-on-rails

我有一个客户模型,代表客户以及他们在特定日期在商店购买的单件。

例如,如果Customer1以1/1进入并购买了篮球。 虽然Customer2以2/1的价格买了一个Doll,但模型看起来像这样:

|----------------|------------|------------------|------------|
|    Customer    |    Date    |       Item       |    Name    |
|----------------|------------|------------------|-------------
|       1        |    1/1     |    Basketball    |     Bu     |
|----------------|------------|------------------|-------------
|       2        |    2/1     |       Doll       |     Hu     |
|----------------|------------|------------------|-------------

现在,如果我希望获取一个表格,按日期分组,这会在某一天汇总所有购买的商品,我会写下这样的内容:

customers.group("DATE_FORMAT(date(started_at), '%d-%m')").count

这会给我一张看起来像这样的表:

|------------|-------------|
|    Date    |    Count    |
|------------|-------------|
|    1/1     |      1      |
|------------|-------------|
|    2/1     |      1      |
|------------|-------------|

但是,如果我想在每一天计算每件商品的数量,请加上商店中所有商品的总和?如何在rails中编写它以获得以下输出?

|------------|------------------|------------|-----------|
|    Date    |    Basketball    |    Doll    |    Sum    |
|------------|------------------|------------|-----------|
|    1/1     |        1         |      0     |     1     |
|------------|------------------|------------|-----------|
|    2/1     |        0         |      1     |     1     |
|------------|------------------|------------|-----------|
  • 可以在查询中指出我想要总结的项目名称。在这种情况下。它只是'篮球'和' Doll'。

1 个答案:

答案 0 :(得分:3)

SELECT Date,
       SUM( CASE WHEN Item = 'Basketball' THEN 1 ELSE 0 END ) AS BasketBall,
       SUM( CASE WHEN Item = 'Doll' THEN 1 ELSE 0 END ) AS Doll,
       COUNT(1) AS Totalsum 
  FROM Customers
GROUP BY Date;