我用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
什么是查询总和案例最好用在这里?提前谢谢。
答案 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
请注意,两个查询返回的数据类型需要兼容。如果Quantity
和TotalPrice
都定义为整数,则不会出现问题。
此外,没有具体保证“数量”行将在“TotalPrice”行之前;我们观察到这种行为,它不太可能会有所不同。但是,要获得保证,我们需要一个ORDER BY
条款。因此,包括一个额外的鉴别器列(每个查询的SELECT列表中的文字),这将给我们一些我们可以订购的东西。
请注意,此单个查询无法为IdProduct“0003”动态创建另一列。我们需要将它添加到每个查询的SELECT列表中。
我们可以分两步执行此操作,使用查询获取不同IdProduct的列表,然后使用它来动态创建我们需要的查询。
但......所有这些......我们不想要这样做。
规范模式是将Quantity
和TotalPrice
作为两个单独的列返回,将IdProduct
作为另一列返回。例如,此语句返回的结果:
SELECT t.IdProduct
, SUM(t.Quantity) AS `Quantity`
, SUM(t.TotalPrice) AS `TotalPrice`
FROM mytable t
GROUP BY t.IdProduct
然后客户端应用程序负责将结果集转换为所需的显示表示。
我们不希望将该工作(将结果转换为显示表示)推送到SQL中。