从Access到MySQL的SQL查询转换

时间:2014-12-16 20:23:27

标签: javascript php mysql sql-server pivot-table

我有一个用JavaScript / HTML编写的应用程序,它使用本地机器数据库。这是一个非常复杂的问题,但我现在只需要SQL查询的帮助。有关本地JavaScript数据库类的更多信息,请访问:JavaScript Access database class

数据由3D值和时间组件组成,因此数据库非常大,但我将数据从200个时间步骤简化为3个以进行测试。有多个值描述3D模型,因此我使用下拉菜单访问不同的值。不幸的是,我没有可以向任何人展示的工作版本,因为它只能在本地机器上运行。我正在尝试将此版本转换为运行MySQL的网络式数据库驱动的演示。我在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.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的查询?

感谢您的帮助和见解

1 个答案:

答案 0 :(得分:1)

MySQL中没有TRANSFORMTRANSFORM实际上只是一个别名,因此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