我有一个表的分析查询。那张表有很多列,我只显示那些重要的列
table oc_za_puni_uredjaj
sif_company (integer - primary, value for company)
sif_device (integer - primary, value for device)
sif_nos (integer - primary, value for customer)
sif_mp (integer - primary, value for customer's place)
rbr (integer - primary, value for customer's place item)
ocitano (integer - 0 - empty, 1 - full)
datum (date - date of the record)
area (text - name of area of customer)
....
我现有的查询是
$data = DB::table('oc_za_prazni_uredjaj')->select(DB::raw('area as naselje, count(*) total, sum(case when ocitano = 1 then 1 else 0 end) ocitano'))
->where('sif_company',$request->sif_company)
->groupBy('area')->get();
如果我得到了每个客户/客户的位置和一台设备的项目(就像整个表中只有1
sif_device
)的正确数据。例如
sif_company | sif_device | sifnos | sif_mp | rbr | ocitano | datum | area |
---------------------------------------------------------------------------
1 | 1 | 1 | 1 | 1 | 1 |... |abcd
1 | 1 | 1 | 2 | 1 | 0 |... |abcd
1 | 1 | 2 | 1 | 1 | 1 |... |abc
1 | 1 | 1 | 2 | 1 | 1 |... |abcd
1 | 1 | 1 | 2 | 3 | 1 |... |abcd
输出数据类似(仅适用于一个设备)
naselje | total | ocitano
------------------------------------
abc | 1 | 1
abcd | 4 | 3
问题是如果我有两个不同设备的相同数据。我可以把数据放在下面的表格里
sif_company | sif_device | sifnos | sif_mp | rbr | ocitano | datum | area |
---------------------------------------------------------------------------
1 | 1 | 1 | 1 | 1 | 1 |... |abcd
1 | 2 | 1 | 1 | 1 | 0 |... |abcd
1 | 1 | 2 | 1 | 1 | 1 |... |abcd
1 | 2 | 2 | 1 | 1 | 1 |... |abcd
1 | 1 | 3 | 1 | 1 | 1 |... |abc
我想要的数据输出应该是
naselje | total | ocitano
------------------------------------
abc | 1 | 1
abcd | 2 | 2
因此,如果我在表格行中为不同设备(
sif_nos
,sif_mp
,rbr
)设置了(sif_device
,ocitano = 1
),则我有以下情况:如果其中只有一个有
ocitano = 1
那么对于那个区域,我必须将输出中的ocitano增加1,并取ocitano值为1的行(用于以后的工作)如果有多行
datum
,则我必须将输出中的ocitano增加1,并将具有最新日期(columnocitano = 0
)的行作为以后的工作如果它们都
$izlaz
的话,我就不会增加ocitano的产量。有什么帮助就好了
编辑
到目前为止,我已经成功地获得了一系列数据,我希望在这些数据上运行我的查询,而不是乞求这个问题。功能是
public function testFunction(Request $request){
$sif_tvrtka = $request->sif_tvrtka;
$podaci = za_prazni_uredjaj::where('sif_company',$sif_tvrtka)->get();
$indeks = 0;
$izlaz = new Collection();
//tried with array also
//$izlaz = [];
foreach ($podaci as $podatak){
$exists = false;
foreach ($izlaz as $izl){
if($izl->sifnos == $podatak->sifnos && $izl->sifkup == $podatak->sifkup && $izl->redbrprik == $podatak->redbrprik){
$exists = true;
break;
}
}
if ($exists == true){
foreach ($izlaz as &$izl){
if($izl->sifnos == $podatak->sifnos && $izl->sifkup == $podatak->sifkup && $izl->redbrprik == $podatak->redbrprik) {
if ($izl->ocitano < $podatak->ocitano) {
$izl = $podatak;
} else {
if ($izl->datumNovogOcitanja < $podatak->datumNovogOcitanja)
{
$izl = $podatak;
}
}
}
}
}
else{
$izlaz[$indeks++] = $podatak;
}
}
dd($izlaz);
}
但我有一个小问题。中的数据未收集,因此无法使用查询生成器进行查询
$data = DB::table('oc_za_prazni_uredjaj')->select(DB::raw('area as naselje, count(*) total, sum(case when ocitano = 1 then 1 else 0 end) ocitano'))
->where('sif_company',$request->sif_company)
->groupBy('area')->get();
有没有更好的方法来实现这个目标?
最佳答案
看到这个编辑,你将不得不调整它,但得到的想法。
这能得到预期的结果吗?
//one of them has ocitano = 1
$data1 = DB::table('oc_za_prazni_uredjaj')->select(DB::raw('area as naselje, count(*) total, sum(case when ocitano = 1 then 1 else 0 end) ocitano'))
->where('sif_company',$request->sif_company)
->having('sum(ocitano)', 1)
->groupBy('area');
// several rows with ocitano = 1
$data2 = DB::table('oc_za_prazni_uredjaj')->select(DB::raw('area as naselje, count(*) total, sum(case when ocitano = 1 then 1 else 0 end) ocitano, sum(ocitano) ocitano_max, max(datum) datum'))
->where('sif_company',$request->sif_company)
->having('ocitano_max', '>', 1)
->groupBy('area');
//ocitano = 0
$data0 = DB::table('oc_za_prazni_uredjaj')->select(DB::raw('area as naselje, count(*) total, max(ocitano) ocitano, max(datum) datum'))
->where('sif_company',$request->sif_company)
->where('ocitano', 0)
->groupBy('area', 'sif_device');
$data = $data1->unionAll($data0)->unionAll($data2);
$data = $data->get();
关于php - 一个 Eloquent 团队由几个不同的列合并,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37681798/