MySQL Sum和Case Query

时间:2014-08-29 16:01:15

标签: mysql vb.net reportviewer report-viewer2010

我用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   

什么是查询总和案例最好用在这里?提前谢谢。

2 个答案:

答案 0 :(得分:0)

select idproduct, sum(quantity), sum(totalprice)
from your_table
group by idproduct

答案 1 :(得分:0)

注意:查询无法“动态”更改返回列的数量或数据类型,在解析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都定义为整数,则不会出现问题。

此外,没有具体保证“数量”行将在“TotalPrice”行之前;我们观察到这种行为,它不太可能会有所不同。但是,要获得保证,我们需要一个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中。