【问题标题】:MySQL Sum and Case QueryMySQL Sum 和 Case 查询
【发布时间】:2014-10-23 16:24:15
【问题描述】:

我用 VB.NET 创建了一个连接到 MySQL 数据库的 ReportViewer。数据如下所示。

    IdProduct       Quantity       TotalPrice      OrderDate
    0001                1              10          29/09/2014
    0002                2              40          29/09/2014       
    0001                4              40          29/09/2014      
    0001                2              20          29/09/2014      
    0001                2              20          29/09/2014    

根据上面的记录,我希望结果如下所示

   0001   0002  
    9      2
    90     40   

Query Sum Case 在这里的最佳用途是什么?提前致谢。

【问题讨论】:

  • IdProduct 是否仅限于 2 才可能?我想没有,你所追求的结果集最好在你的应用程序级代码中处理

标签: mysql vb.net reportviewer report-viewer2010


【解决方案1】:

注意:查询不可能“动态”更改返回的列的数量或数据类型,必须在解析 SQL 文本时指定。

要通过查询返回指定的结果集,您可以执行以下操作:

SELECT SUM(IF(t.IdProduct='0001',t.Quantity,NULL)) AS `0001`
     , SUM(IF(t.IdProduct='0002',t.Quantity,NULL)) AS `0002`
  FROM mytable t
 UNION ALL
SELECT SUM(IF(t.IdProduct='0001',t.TotalPrice,NULL)) AS `0001`
     , SUM(IF(t.IdProduct='0002',t.TotalPrice,NULL)) AS `0002`
  FROM mytable t

请注意,两个查询返回的数据类型需要兼容。如果QuantityTotalPrice 都定义为整数,这不会有问题。

此外,没有具体保证“数量”行将位于“总价格”行之前;我们观察到这种行为,它不太可能会有所不同。但是,为了保证,我们需要一个ORDER BY 子句。因此,包括一个额外的鉴别器列(每个查询的 SELECT 列表中的文字),这会给我们一些我们可以排序的东西。

请注意,不能让这个单一查询为 IdProduct '0003' 动态创建另一列。我们需要将其添加到每个查询的 SELECT 列表中。

我们可以分两步执行此操作,使用查询来获取不同 IdProduct 的列表,然后使用它来动态创建我们需要的查询。


但是...话虽如此...我们不想这样做。

规范模式是将QuantityTotalPrice 作为两个单独的列返回,IdProduct 作为另一列返回。比如这条语句返回的结果:

SELECT t.IdProduct
     , SUM(t.Quantity) AS `Quantity`
     , SUM(t.TotalPrice) AS `TotalPrice`
  FROM mytable t
 GROUP BY t.IdProduct

然后客户端应用程序将负责将该结果集转换为所需的显示表示。

我们不想将这项工作(将结果转换为显示表示)推到 SQL 中。

【讨论】:

    【解决方案2】:
    select idproduct, sum(quantity), sum(totalprice)
    from your_table
    group by idproduct
    

    【讨论】:

    • 即查询只显示结果。我想将 IdProduct 设置为 ColumnName
    • 这是一个表示问题,最好在您的逻辑中处理。
    • 如果您有新问题,请点击 按钮提出问题。如果有助于提供上下文,请包含指向此问题的链接。
    • 请帮忙..我尝试使用案例,但结果与我预期的不一样@Elwinar:这是同一个问题。
    • 生成动态列名其实比较难。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 2011-04-10
    • 2017-06-05
    • 1970-01-01
    • 2011-03-04
    相关资源
    最近更新 更多