2017-08-17 148 views
2

我有2 sql queries(每個一個學期)。這兩個查詢不具有相同的行數。每個包含3個參數:Article id_Customer Turnover如何比較兩個查詢結果在同一個循環

這以下,其計算第一學期的請求:

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

如您所見,客戶可以在兩個學期或一個學期僅在一個學期(第一個或第二個)的文章營業額。 我想首先比較每個學期每個customer每個Article的營業額。

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

我建議首先將您的數據結構轉換爲將相關內容在一個對象中組合在一起的東西,而不是與索引編號鏈接。

例如,對於客戶端594,誰是參與的兩篇文章,這學期轉旁白可以這樣表示:

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

...其中內陣列始終有兩個入口:每個的兩個學期。該結構將允許輕鬆報告。

這裏是以下這對於例如輸出轉換的代碼:

// 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個值的內部數組。 – trincot

+1

當我看到你的其他問題時,我真的很想知道爲什麼你在'query1'中創建了這個結構:如果你把所有的LRU放在一個數組中,而所有的客戶端放在另一個數組中,它就會讓事情變得困難。您應該將相關的LRU和客戶端(和輪)一起保存在一個對象中,然後創建這些對象的數組。無論如何,你基於query1和query2提出了你的問題,所以我已經回答了這些信息。 – trincot

相關問題