2017-08-17 11 views
2

私は2つのsql queriesを持っています(それぞれ1つの学期に対応します)。これらの2つのクエリの行数は同じではありません。それぞれには3つのパラメータ:Article id_Customer Turnoverが含まれています。同じループで2つのクエリの結果を比較する方法

select "LRU", "Client", round(sum("Montant_fac_eur")) 
from "foundry_sync"."data" 
where "Nature"='Repair'  

and extract(month from "Facturation") between 0+{{w_widget6.selectedValue}} and 5+{{w_widget6.selectedValue}} 
group by "LRU", "Client" 

クエリの学期は次のように表す:最初の学期を計算要求次

この

{ 
    "LRU": [ 
    "ATSU", 
    "ATSU", 
    "ATSU", 
    "ATSU 
     . 
     . 
     . 
    ], 
"Client": [ 
    394, 
    594, 
    4001, 
    5725, 
    7057, 
    7090 
    . 
    . 
    . 
], 
"round": [ 
    20866, 
    16814, 
    27421, 
    0, 
    6593, 
    66965, 
    8401 
    . 
    . 
    . 
] 

この結果のサンプル次

result 1      result2 

"[Article1,394,3914]"  "[Article1,394,3914]" 
"[Article1,594,16814]"  "[Article2,594,10088]" 
"[Article1,4001,26798]" "[Article1,4001,11107]" 
"[Article3,5725,0]"  "[Article3,5725,0]" 
"[Article5,7057,5700]"  "[Article5,7057,3916]" 
"[Article8,7090,56467]" "[Article4,7090,17558]" 
"[Article2,7236,8401]"  "[Article8,7236,8401]" 
"[Article11,7242,12766]" "[Article14,7242,4255]" 
"[Article2,7262,892]"  "[Article2,7262,892]" 
"[Article3,7302,17234]" "[Article3,7302,8928]" 

ご覧のとおり、お客様は両方の学期に商品の売上高を得ることができます。 1学期(第1学期または第2学期)の論文の売上高。 最初に、各学期のごとにcustomerの売上高を比較したいと思います。

var query1 = {{repair_semestre1}}; 
    var query2 = {{repair_semestre2}}; 
    var result1 = []; 
    var result2 = []; 


    for (var i = 0; i < query1.LRU.length; i++) { 
     result1.push(formatName(query1.LRU[i], query1.Client[i], query1.round[i])); 
    } 

    for (var i = 0; i < query2.LRU.length; i++) { 
     result2.push(formatName(query2.LRU[i], query2.Client[i], query2.round[i])); 
    } 

    return { 
     result1: result1, 
     result2: result2 
    }; 

    /* for (var i = 0; i < query1.LRU.length, i < query2.LRU.length; i++) { 
     if((query1.LRU[i] == query2.LRU[i]) && (query1.Client[i] == query2.Client[i])) { 
        if(query1.round[i] > query2.round[i]) { 
          return "ok"; 
        } 
        else { return "non"; 
        } 
     } 

    } */ 

    function formatName(lru, turnover, round) { 
     return "[" + lru + "," + turnover + "," + round + "]"; 
    } 

私は彼女の結果を比較する機能外のこれら2つのクエリのループをした:

var query1 = {{repair_semestre1}}; 
var query2 = {{repair_semestre2}}; 
for (var i = 0; i < query1.LRU.length, i < query2.LRU.length; i++) { 
    if((query1.LRU[i] == query2.LRU[i]) && (query1.Client[i] == query2.Client[i])) { 
       if(query1.round[i] > query2.round[i]) { 
         return "ok"; 
       } 
       else { return "not ok"; 
       } 
    } 
} 

それだけでnot okを返し、残りの行を完了していません。私がなぜそれを説明してくれますか? そして、このループを関数に追加して実行するにはどうしたらいいですか?

ありがとうございます。

+3

return'が検出された 'たら、ループが実行を終了します。たぶん結果の配列を作成する必要がありますか?適切なデータを使って作業例を投稿すると、私は助けようとする可能性があります。 –

+1

@MaazSyedAdeeb私は私の質問を編集した、私はトウクエリの配列を行った私の機能を追加しました。適切なデータを掲示するには、上記のデータは適切なデータです。記事の名前を1、2、8で変更します。私はあなたを理解してくれることを願っています。ご協力ありがとうございました。 – vero

+0

@MaazSyedAdeebどうすればこの問題を解決できますか。 – vero

答えて

1

まず、データ構造を、インデックス番号を持つリンクではなく、1つのオブジェクト内で関連するものをグループ化するものに変換することをお勧めします。それぞれのため:内側の配列は常に2つのエントリを有する場合...

{ 
    "594": { 
    "Article1": [ 
     16814, 
     0 
    ], 
    "Article2": [ 
     0, 
     10088 
    ] 
    } 
} 

:例えば

は、2件の記事に関与しているクライアント594、のために、学期のターンオーバーは、次のように表すことができます2つの学期のうちの1つ。その構造は簡単な報告を可能にする。ここで

は、次の出力例による形質転換のためのコードです:

// Sample data 
 
const query1 = { 
 
    LRU: ["Article1", "Article1", "Article1", "Article3", "Article5", 
 
      "Article8", "Article2", "Article11", "Article2", "Article3"], 
 
    Client: [394, 594, 4001, 5725, 7057, 7090, 7236, 7242, 7262, 7302], 
 
    round: [3914, 16814, 26798, 0, 5700, 56467, 8401, 12766, 892, 17234] 
 
}, query2 = { 
 
    LRU: ["Article1", "Article2", "Article1", "Article3", "Article5", 
 
      "Article4", "Article8", "Article14", "Article2", "Article3"], 
 
    Client: [394, 594, 4001, 5725, 7057, 7090, 7236, 7242, 7262, 7302], 
 
    round: [3914, 10088, 11107, 0, 3916, 17558, 8401, 4255, 892, 8928] 
 
}; 
 

 
// Convert to a more useful data structure, keyed by client and article 
 
const data = {}; 
 
[query1, query2].forEach(function (query, semester) { 
 
    query.Client.forEach(function(clientId, index) { 
 
     var client = data[clientId] = data[clientId] || {}; 
 
     var clientArt = client[query.LRU[index]] = client[query.LRU[index]] || [0, 0]; 
 
     clientArt[semester] = query.round[index]; 
 
    }); 
 
}); 
 

 
// Now report on that data 
 
for (const client in data) { 
 
    for (const article in data[client]) { 
 
     const turnovers = data[client][article]; 
 
     console.log('Client: ' + client + ', art.: ' + article 
 
        + ', semester t/o: ' + turnovers 
 
        + ' ' + (turnovers[0] === turnovers[1] ? 'equal' : 
 
          turnovers[0] < turnovers[1] ? 'increase' : 
 
                 'decrease')); 
 
    } 
 
}
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

この優れたソリューションに感謝します。しかし、ちょうど私は300以上の顧客と46の記事を持っていると伝えておきます。構造を変更すると、どのように回復できますか?また、私の質問の結果は、彼がそれを見たいと思っているユーザーの選択に応じて動的に変化します。これは私の学期です:https://stackoverflow.com/questions/45464774/how-to-compute-the-turnover-each-semester – vero

+1

私の答えには変換を行うためのコードが含まれているので、実際には変更する必要はありません何でも学期について:あなたの質問では、別のクエリ変数で各学期を代表しました。私の答えでは、 '[query1、query2]'を置いた場所に変数を置くことができます。あなたが変数として持っているものを置くだけです。 3つの学期があれば、そこに3つの学期を置くと、3つの値を持つ内部配列が得られます。 – trincot

+1

私はあなたの他の質問を見ると、なぜあなたが 'query1'のように構造を作ったのか、本当に不思議です。すべてのLRUを1つの配列に入れ、すべてのクライアントを別の配列に入れると難しいことです。関連するLRUとクライアント(およびラウンド)を1つのオブジェクトにまとめておき、それらのオブジェクトの配列を作成する必要があります。とにかく、あなたはquery1とquery2に基づいてあなたの質問をしたので、私はその情報で答えました。 – trincot

関連する問題