【问题标题】:mysql selecting conditional valuesmysql选择条件值
【发布时间】:2015-11-16 16:48:51
【问题描述】:

我有一个帐单表,其中有 PurchaseDate、ItemType、ItemSize 和其他详细信息。

帐单

+--------------------------------------------+
| PurchaseDate | ItemType | ItemSize | price |
+--------------------------------------------+
| 1-Jan-2015   | Jumper   | S        | 20    |
| 1-Jan-2015   | Jumper   | S        | 20    |
| 1-Jan-2015   | Jumper   | M        | 20    |
| 1-Jan-2015   | Jumper   | L        | 20    |
| 1-Jan-2015   | Shirt    | M        | 15    |
| 1-Jan-2015   | Shirt    | M        | 15    |
| 2-Jan-2015   | Shirt    | L        | 20    |
+--------------------------------------------+
...

ItemType 是固定的,可以是 Jumper 或 Shirt。 ItemSize 是固定的,可以是 S、M 或 L。

我需要的是显示订购商品的摘要 PurchaseDate,后跟存在的每个组合的计数 每个日期。

示例输出

+----------------------------------------------------------------------------------+
| Date       | Jumper[S] | Jumper[M] | Jumper[L] | Shirt[S] | Shirt[M] | Shirt[L]  |
+----------------------------------------------------------------------------------+
| 1-Jan-2015 | 2         | 1         | 1         | 0        | 1         | 0        |
| 2-Jan-2015 | 1         | 5         | 0         | 1        | 3         | 3        |
| 3-Jan-2015 | 0         | 0         | 0         | 0        | 0         | 0        |
| 4-Jan-2015 | 0         | 3         | 1         | 1        | 2         | 2        |
+----------------------------------------------------------------------------------+

这可以使用 mysql 查询吗?

【问题讨论】:

    标签: mysql conditional


    【解决方案1】:

    是的,这是可能的。

    select PurchaseDate, 
    sum(if(ItemType="Jumper" AND ItemSize="S",1,0)) as "Jumper[S]",
    sum(if(ItemType="Jumper" AND ItemSize="M",1,0)) as "Jumper[M]",
    sum(if(ItemType="Jumper" AND ItemSize="L",1,0)) as "Jumper[L]",
    sum(if(ItemType="Shirt" AND ItemSize="S",1,0)) as "Shirt[S]",
    sum(if(ItemType="Shirt" AND ItemSize="M",1,0)) as "Shirt[M]",
    sum(if(ItemType="Shirt" AND ItemSize="L",1,0)) as "Shirt[L]"
    
    from TableName
    group by PurchaseDate;
    

    案例:如果您需要一个月的所有日期,请创建一个表格,其中一列包含所有日期。设表名是“datetable”,列名是“datecolumn”。

    select t1.datecolumn, 
    sum(if(ItemType="Jumper" AND ItemSize="S",1,0)) as "Jumper[S]",
    sum(if(ItemType="Jumper" AND ItemSize="M",1,0)) as "Jumper[M]",
    sum(if(ItemType="Jumper" AND ItemSize="L",1,0)) as "Jumper[L]",
    sum(if(ItemType="Shirt" AND ItemSize="S",1,0)) as "Shirt[S]",
    sum(if(ItemType="Shirt" AND ItemSize="M",1,0)) as "Shirt[M]",
    sum(if(ItemType="Shirt" AND ItemSize="L",1,0)) as "Shirt[L]"
    
    from datetable  t1 left join TableName  t2 on ( date(t1.datecolumn)=date(t2.PurchaseDate))
    
    Where date(t1.datecolumn) between <date_1> and <date_2> // optional if you want data between two dates
    
    group by t1.datecolumn;
    

    注意:代码未经测试。如果发现任何语法错误,请告诉我。

    【讨论】:

    • 感谢海鹰。它奏效了。有没有办法为所有日期设置一行(即使上面的示例中没有像 3-Jan 这样的值?
    • @nads : 你能创建一个只有一列包含当月所有日期的虚拟表吗?
    • @nads 我已根据您的需要更新了答案。您可以根据年份或月份或两个日期之间筛选数据。如果您发现任何问题,请告诉我。
    • 成功了! (尽管我不得不将select PurchaseDategroup by PurchaseDate 替换为select datecolumngroup by datecolumn。非常感谢Seahawk!
    • @nads :是的,你完全正确。我在编辑代码时忘记替换。我已经更新了它。 :)
    猜你喜欢
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 2012-03-06
    相关资源
    最近更新 更多