我有一个用JavaScript/HTML编写的应用程序,它利用本地机器数据库。这是一个非常复杂的问题,但我现在只需要SQL查询的帮助。有关本地 JavaScript 数据库类的更多信息,请参见:JavaScript Access 数据库类
数据由 3D 值和时间分量组成,因此数据库非常大,尽管我将数据从 200 个时间步长简化为 3 个进行测试。 有多个描述 3D 模型的值,因此我使用下拉列表访问不同的值。不幸的是,我没有可以向任何人展示的工作版本,因为它仅适用于本地机器。我正在尝试将此版本转换为运行MySQL的Web样式数据库驱动的演示。 我在FatCow主持,如果你认识他们,你就知道他们有一个php驱动的MySQL接口。
数据设置
数据的设置方式,我有几列描述 3D 数据表,如下所述。这是针对一个名为"dat"的表:
- 单元格
- (矩阵中该单元格的唯一编号(
- XVal(这是矩阵中的X位置(
- YVal(这是矩阵中的 Y 位置(
- 提升(这是矩阵中的 Z 位置(
- Oct-97(这是具有值的三个时间分量之一(
- Oct-07(这是具有值的三个时间分量之一(
- Oct-17(这是具有值的三个时间分量之一(
有几个表被调用来制作网格,但现在让我们只关注"dat"表
一些数据表的设置与引用XVal和YVal类似,但有些仅引用唯一的Cell值。 对于当前应用程序,我获取大列数据并执行转换数据透视表以创建模型的网格。 3D 矩阵网格为 36x41x15。这些网格显示为:
- XY 平面视图
- XZ 横截面
- YZ 横截面
对于在本地应用程序中工作的每个网格,我有三个SQL查询,但这些查询在MySQL中不起作用。 请记住,我正在自学如何做这些事情,所以我有点缺乏经验。如果这是一个明显的错误,请不要杀我。
在本地应用程序上工作的 SQL 查询
对于上述三个查询,以下是有效的方法:
-
XY网格:
TRANSFORM ROUND(max(dat.[Oct-07]) *100,2) SELECT dat.Yval FROM dat WHERE (((dat.Lift)=7)) GROUP BY dat.Yval ORDER BY dat.Yval DESC , dat.Xval PIVOT dat.Xval;
-
XZ 网格:
TRANSFORM ROUND(max(dat.[Oct-07]) *100,2) SELECT dat.Lift FROM dat WHERE (((dat.Yval)=20)) GROUP BY dat.Lift, dat.Yval ORDER BY dat.Lift DESC PIVOT dat.Xval;
-
YZgrid:
TRANSFORM ROUND(max(dat.[Oct-07]) *100,2) SELECT dat.Lift FROM dat WHERE (((dat.Xval)=20)) GROUP BY dat.Lift ORDER BY dat.Lift DESC , dat.Yval DESC PIVOT dat.Yval;
应用程序调用需要显示的 XVal、YVal 或 Lift。因此,在 XY 网格中,[Oct-07] 是查询中的一个变量,就像 dat 一样。提升(从 1 到 15 的数字(。
同样,在其他两个网格中,[Oct-07] 是查询中的一个变量,就像 dat 一样。是的还是哒。分别是十五。
将数据导入MySQL后,我尝试运行这些查询,但它们给出了错误:
MySQL said: Documentation
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TRANSFORM ROUND( max( dat . [ Oct - 07 ] ) * 100 , 2 ) SELECT dat . Yval FROM da' at line 1
我使用 ROUND(MAX(...返回列的每个值并修复小数。
我认为问题出在 TRANSFORM 语句中,但我不确定如何翻译它并获得相同的结果。
问题是,如何将这三个查询从基于 MS Access 的查询转换为基于 MySQL 的查询?
感谢您的帮助和见解
MySQL中没有TRANSFORM
。 TRANSFORM
实际上只是一个别名,因此MS Access将为您创建"交叉表"查询,并且您可以使用更少的代码。而是使用 ANSI SQL 方式。
http://www.paragoncorporation.com/ArticleDetail.aspx?ArticleID=25
ANSI SQL 交叉表查询示例:
Example ANSI-SQL Crosstab
SELECT
SUM(CASE WHEN purchase_date BETWEEN '2004-08-01' and '2004-08-31' THEN amount ELSE 0 END) As m2004_08,
SUM(CASE WHEN purchase_date BETWEEN '2004-09-01' and '2004-09-30' THEN amount ELSE 0 END) As m2004_09,
SUM(CASE WHEN purchase_date BETWEEN '2004-10-01' and '2004-10-31' THEN amount ELSE 0 END) As m2004_10,
SUM(amount) As Total
FROM purchases WHERE purchase_date BETWEEN '2004-08-01' AND '2004-10-31'
您可能需要使用GROUP_CONCAT
如果可以使用存储过程,那将是最容易的
以下是在 MySQL 中创建交叉表查询的快速教程:http://www.databasejournal.com/features/mysql/article.php/3855376/All-About-the-Crosstab-Query.htm