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