我使用连接到 MySQL 数据库的 VB.NET 创建一个 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
查询求和大小写在这里的最佳用途是什么?提前致谢。
最佳答案
注意:查询不可能“动态”更改返回列的数量或数据类型,这些必须在解析 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
都定义为整数,这不会成为问题。
此外,没有具体保证“Quantity”行位于“TotalPrice”行之前;我们观察到这种行为,并且它不太可能会有所不同。但是,为了得到保证,我们需要一个 ORDER BY
子句。因此,包括一个额外的鉴别器列(每个查询的 SELECT 列表中的文字),这将为我们提供一些可以 ORDER BY 的东西。
请注意,不可能让此单个查询动态地为 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 中。
关于MySQL 求和与大小写查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25571970/