我有一个用JavaScript / HTML编写的应用程序,它使用本地机器数据库。这是一个非常复杂的问题,但我现在只需要SQL查询的帮助。有关本地JavaScript数据库类的更多信息,请访问:JavaScript Access database class
数据由3D值和时间组件组成,因此数据库非常大,但我将数据从200个时间步骤简化为3个以进行测试。有多个值描述3D模型,因此我使用下拉菜单访问不同的值。不幸的是,我没有可以向任何人展示的工作版本,因为它只能在本地机器上运行。我正在尝试将此版本转换为运行MySQL的网络式数据库驱动的演示。我在FatCow主持,如果你了解它们,你知道他们有一个PHP驱动的MySQL界面。
设置数据的方式,我有几个描述3D数据表的列如下所述。这是一个名为“dat”的表:
有几个表被调用来制作网格,但现在让我们只关注'dat'表
某些数据表的设置与参考XVal和YVal类似,但有些数据表仅参考唯一的Cell值。在当前的应用程序中,我获取大量数据并执行转换数据透视表以创建模型的网格。 3D矩阵网格为36x41x15。这些网格显示为:
对于在本地应用程序中工作的每个网格,我有三个SQL查询,但这些查询在MySQL中不起作用。请记住,我正在教自己如何做这些事情,所以我有点缺乏经验。如果这是一个明显的错误,不要杀了我。
对于上述三个查询,以下是有效的:
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.Lift(1到15之间的数字)。
类似地,在另外两个网格中,[Oct-07]是查询中的变量,分别是dat.YVal或dat.XVal。
将数据导入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的查询?
感谢您的帮助和见解
答案 0 :(得分:1)
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
,如果您可以使用stored procedures
这是一个关于在MySQL中创建交叉表查询的快速教程:http://www.databasejournal.com/features/mysql/article.php/3855376/All-About-the-Crosstab-Query.htm