SQL查询中的条件情况

时间:2016-06-14 11:15:28

标签: mysql

我的桌子设计是下一个

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_nossif_mprbr)的表格行中有不同的设备(sif_device),那么我有案例:

  • 如果只有其中一个ocitano = 1那么对于那个区域我必须将输出中的ocitano 增加1(对于一个设备甚至可能只有一行)
  • 如果有多行ocitano = 1,那么我必须在输出中增加ocitano 1
  • 如果所有人都ocitano = 0,那么我不会在输出中增加ocitano

编辑

SQL Fiddle

任何帮助都会很好

编辑2

例如,如果我有3个设备(1,2和3),则可能有1个设备的行(sif_nossif_mprbr),2个设备或所有(所有3个设备)等。

1 个答案:

答案 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的计数。

它确实达到了您想要的效果。希望当你向它投入更多的测试数据时,例程会按照你的意思行事,这可以通过几种方式解释。