2017-08-17 233 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

相关问题