我的桌子设计是下一个
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)
下一个数据库中的数据示例
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
我现有的查询(有些情况下)是下一个
SELECT area as naselje,
count(*) total,
sum(case when ocitano = 1 then 1 else 0 end) ocitano
FROM `oc_za_puni_uredjaj`
WHERE sif_company = 1 group by 1
结果如
naselje | total | ocitano
------------------------------------
abc | 1 | 1
abcd | 4 | 3
问题是我是否有2个不同设备的相同数据(sif_device
)。我可以在下表中找到数据
sif_company | sif_device | sifnos | sif_mp | rbr | ocitano | datum | area |
---------------------------------------------------------------------------
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 ocitano = 0
,那么我不会在输出中增加ocitano 编辑
任何帮助都会很好
编辑2
例如,如果我有3个设备(1,2和3),则可能有1个设备的行(sif_nos
,sif_mp
,rbr
),2个设备或所有(所有3个设备)等。
答案 0 :(得分:1)
CREATE TABLE IF NOT EXISTS `oc_za_puni_uredjaj` (
`sif_company` int(11) NOT NULL,
`sif_device` int(11) NOT NULL,
`sif_nos` int(11) DEFAULT NULL,
`sif_mp` int(11) DEFAULT NULL ,
`rbr` int(11) DEFAULT NULL,
`ocitano` int(11) DEFAULT NULL,
`datum` datetime DEFAULT NULL,
`area` varchar(255) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`sif_company`,`sif_device`,`sif_nos`,`sif_mp`,`rbr`)
);
insert into `oc_za_puni_uredjaj` values
(1,1,1,1,1,1,"2016-05-24 12:01:49","abcd"),
(1,2,1,1,1,0,"2016-05-24 12:01:41","abcd"),
(1,1,2,1,1,1,"2016-05-24 12:01:43","abcd"),
(1,2,2,1,1,1,"2016-05-24 12:01:48","abcd"),
(1,1,3,1,1,1,"2016-05-24 12:01:46","abc");
select naselje,total,sum(ocitano1) as ocitano
from
( SELECT area as naselje, sif_device,
count(*) total,
least(sum(case when ocitano = 1 then 1 else 0 end),1) ocitano1 -- max out at one
FROM `oc_za_puni_uredjaj`
WHERE sif_company = 1
group by area,sif_device
) xDerived
group by naselje,total
order by naselje;
+---------+-------+---------+
| naselje | total | ocitano |
+---------+-------+---------+
| abc | 1 | 1 |
| abcd | 2 | 2 |
+---------+-------+---------+
xDerived
只是一个别名。每个派生表都需要别名,否则会发生错误。 least
功能限制按ocitano
分组时area,sif_device
的计数。
它确实达到了您想要的效果。希望当你向它投入更多的测试数据时,例程会按照你的意思行事,这可以通过几种方式解释。