我如何加入两个表sql

时间:2017-05-24 01:41:58

标签: sql filemaker

我有一个问题,我希望你可以帮助我。我正在尝试为我正在处理的应用程序的性能创建图表数据。我打开两个选择语句的第一步是关闭和打开我的功能。

SELECT onSet.testName, 
avg(onSet.elapsed) as avgOn,
0 as avgOff
FROM Results onSet
WHERE onSet.pll = 'On'
GROUP BY onSet.testName

union

SELECT offSet1.testName, 
0 as avgOn, 
avg(offSet1.elapsed) as avgOff
FROM Results offSet1
WHERE offSet1.pll = 'Off'
GROUP BY offSet1.testName

这给了我这样的数据:

Add,0,11.4160277777777778
Add,11.413625,0
Delete,0,4.5245277777777778
Delete,4.0039861111111111,0

显然,工会不是正确的功能。由于数据需要如下所示:

Add,11.413625,11.4160277777777778
Delete,4.0039861111111111,4.5245277777777778

我一直试图让内部联接起作用,但我无法使用该语法。

删除联合并尝试将此语句放在select语句之后也不起作用。我显然有错误的语法。

inner join xxx ON onSet.testName=offset1.testName

在获得这样的数据后,我想应用最后一个select语句,它将从另一个列中减去一个列,并给我区别。所以对我而言,它一次只是一步。

提前致谢。

-KAP

3 个答案:

答案 0 :(得分:2)

我认为您可以使用带有条件聚合的单个查询:

SELECT
    testName,
    AVG(CASE WHEN pll = 'On'  THEN elapsed ELSE 0 END) AS avgOn,
    AVG(CASE WHEN pll = 'Off' THEN elapsed ELSE 0 END) AS avgOff
FROM Results
GROUP BY testName

答案 1 :(得分:0)

我刚刚看到了filemaker标签,并且不知道这是否有效,但在MySQL上我会尝试一下

SELECT testName, sum(if(pll = 'On',elapsed,0)) as sumOn,
                 sum(if(pll = 'On',1,0)) as numOn,
                 sum(if(pll ='Off',elapsed,0)) as sumOff,
                 sum(if(pll ='Off',1,0)) as numOff,
                 sumOn/numOn   as avgOn,
                 sumOff/numOff as avgOff
FROM Results
WHERE pll = 'On' or pll='Off'
GROUP BY testName ;

如果它适合你,那么这应该是相当有效的,因为你不需要加入。如果没有,请大家注意这会引发另一个想法。

您设想的加入的难点在于WHERE子句中的过滤是在加入完成后执行的。因此,您仍然不知道用于计算平均值的记录。如果使用FileMaker无法实现上述操作,请检查嵌套查询是否有效。然后你会

SELECT testName, on.avg as avgOn, off.avg as avgOff
FROM ( SELECT ... FROM Results ...) as on, () as off
JOIN on.testName=off.testName

如果这也不可能,那么我会寻找临时表。

答案 2 :(得分:0)

好的伙计们......再次感谢你的帮助。这是最终的答案。下面的语句是FileMaker自定义函数,它接受4个参数(平台,runID,模型和用户计数。你可以看到指定了sql语句.FileMaker executeSQL()函数不支持嵌套的select语句,不支持嵌入select的IF语句语句(当然是calc函数)最后不支持SQL关键字VALUES.FileMaker支持SQL关键字CASE,它更强大但有点罗嗦.select语句位于一个名为sql的变量中,结果被放置在名为result的变量中.ExecuteSQL()函数的工作方式类似于param文本的printf语句,因此您可以看到交换确实发生。

Let( 
  [
    sql = 
    "SELECT testName, (sum( CASE WHEN PLL='On' THEN elapsed ELSE 0 END)) as sumOn,
                     sum( CASE WHEN PLL='On' THEN 1 ELSE 0 END) as countOn,
                     sum( CASE WHEN PLL='Off' THEN elapsed ELSE 0 END) as sumOff,
                     sum( CASE WHEN PLL='Off' THEN 1 ELSE 0 END) as countOff
     FROM Results
     WHERE Platform = ? 
            and RunID = ?
            and Model = ?
            and UserCnt = ?
     GROUP BY testName";
     result = ExecuteSQL ( sql ; "" ; "" 
                ; platform
                ; runID
                ; model
                ; userCnt )
  ];
    getAverages ( Result ; "" ; 2 )
)

对于那些感兴趣的人,自定义函数如下所示:

getAverages(result,newList,pos)

Let ( 
   [
    curValues = Substitute( GetValue( data; pos ); ","; ¶ );
    sumOn   = GetValue( curValues; 2 ) ;
    countOn = GetValue( curValues; 3 );
    sumOff  = GetValue( curValues; 4 ); 
    countOff    = GetValue( curValues; 5 );
    avgOn   = sumOn / countOn;
    avgOff  = sumOff / countOff
    newItem = ((avgOff - avgOn) / avgOff ) * 100
   ];
    newList & If ( pos > ValueCount( data); newList; 
        getAverages( data; If ( not IsEmpty( newList); ¶ ) & newItem; pos + 1 ))
)