2017-05-24 6 views
0

私はあなたが私を助けてくれると願っています。私は、私が取り組んでいるアプリケーションのパフォーマンスのためのチャートデータを作成しようとしています。私の機能をオフにして2つのselect文を実行するための最初のステップ。どのように2つのテーブルに参加するのですか?

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

は明らかに労働組合が正しく機能ではありません。

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,11.413625,11.4160277777777778 
Delete,4.0039861111111111,4.5245277777777778 

内部結合を実行しようとしていましたが、動作する構文を取得できません。

unionを削除し、select文の後にこの文を挿入しようとしても機能しません。私は明らかに誤った構文をしています。

inner join xxx ON onSet.testName=offset1.testName 

このようにデータを取得した後、別の列から1つの列を減算し、その差を与える最後の選択文を適用したい。だから、私にとっては一度に一つのステップにすぎません。

ありがとうございます。

-KAP

+0

? – maSTAShuFu

答えて

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 
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 

これも可能でない場合、私は一時テーブルを探します。

+0

すべてのアイデアをお寄せいただきありがとうございました。戻ってくるには数時間かかります。私は会議をしてから、昼食を取る。私は戻って、どのアイデアが働くかを伝えることを約束します。入れ子にされた選択ステートメントは機能しません。 FileMakerはそれらをサポートしていませんが、FileMakerの計算エンジンがあります。私はLet()文を使うことができます...最初のsql文の結果を変数に格納し、最初の結果を2番目のsql文に送ります。私はまだ試していないが、それはうまくいくはずだ。 – Keith

+0

聞いてよかったです。私はティムの解答にコミットする十分な評判を持っていない、私は自分の答えの下にここにいる。 0の線は平均の値に影響します。これは、私の例では、発生の合計と数の両方をカウントして「手で」平均を正しく計算することを提案した理由です。 – smoe

0

OKみんな...助けてくれてありがとう。ここに最終的な答えがあります。 FileMakerのexecuteSQL()関数はネストされたselect文をサポートせず、selectに埋め込まれたIF文もサポートしていません。以下のステートメントは、4つの引数(プラットフォーム、runID、モデル、 (calc関数は当然ながら)SQLキーワードVALUESをサポートしていませんFileMakerはSQLのキーワードCASEをサポートしていますが、これはもう少し強力ですがちょっとしたことですselect文はsqlという名前の変数にあり、 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(その結果、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)) 
) 
関連する問題