从mysql数据库

时间:2015-10-07 13:43:18

标签: mysql sql

我正在开发一个项目,我们每天都会收到一些加载到数据库中的文件,它们的状态会被记录到元数据中。

例如, 有两个不同的客户端,我们从中获得三种不同类型的文件,type_a,type_b和type_c。

CLIENT_MASTER
----------------------
client_id|client_name
1|xxx
2|yyy

文件状态存储在FILE_MASTER表

FILE_MASTER
-----------------------------------
file_key|client_id|filename|status
1|1|type_a_2010-10-07.csv|12
2|1|type_b_2010-10-07.csv|12
3|1|type_c_2010-10-07.csv|12
4|2|type_a_2010-10-07.csv|12
5|2|type_b_2010-10-07.csv|12

状态键存储在STATUS_MASTER表

STATUS_MASTER
-------------------
status_key|status
12|Completed

我想开发一个显示每日文件加载状态的信息中心,格式如下 -

Client|type_a|type_b|type_c
xxx|Yes|Yes|Yes
yyy|Yes|Yes|No

对此的任何帮助都将非常感激。

2 个答案:

答案 0 :(得分:1)

此查询将返回当前日期的结果:

SELECT cm.client_name,
       CASE WHEN v.type_a_count > 0 THEN 'Yes' ELSE 'No' END AS type_a,
       CASE WHEN v.type_b_count > 0 THEN 'Yes' ELSE 'No' END AS type_b,
       CASE WHEN v.type_c_count > 0 THEN 'Yes' ELSE 'No' END AS type_c
FROM client_master cm
     LEFT OUTER JOIN (
        SELECT fm.client_id,
               SUBSTRING(fm.client_name, 8, 10) AS file_date,
               SUM(CASE WHEN SUBSTRING(fm.client_name, 1, 6) = 'type_a' THEN 1 ELSE 0 END) AS type_a_count,
               SUM(CASE WHEN SUBSTRING(fm.client_name, 1, 6) = 'type_b' THEN 1 ELSE 0 END) AS type_b_count,
               SUM(CASE WHEN SUBSTRING(fm.client_name, 1, 6) = 'type_c' THEN 1 ELSE 0 END) AS type_c_count 
        FROM file_master fm
        WHERE SUBSTRING(fm.client_name, 8, 10) = CURDATE()
          AND fm.status = 12
        GROUP BY fm.client_id, SUBSTRING(fm.client_name, 8, 10)
     ) v ON cm.client_id = v.client_id

答案 1 :(得分:0)

尝试此查询

SELECT c.name,
IF(FIND_IN_SET('type_a', GROUP_CONCAT(SUBSTRING_INDEX(f1.filename,'_',2))), 'Yes', 'No') as type_a,
IF(FIND_IN_SET('type_b', GROUP_CONCAT(SUBSTRING_INDEX(f1.filename,'_',2))), 'Yes', 'No') as type_b,
IF(FIND_IN_SET('type_c', GROUP_CONCAT(SUBSTRING_INDEX(f1.filename,'_',2))), 'Yes', 'No') as type_c
FROM client_master c
JOIN file_master f1 ON(f1.client_id = c.client_id)
JOIN status_master sm ON(sm.status = f1.status)
WHERE sm.status='Completed' AND SUBSTRING_INDEX(f1.filename,'_',-1) = CURDATE()
GROUP BY c.id