我正在开发一个项目,我们每天都会收到一些加载到数据库中的文件,它们的状态会被记录到元数据中。
例如, 有两个不同的客户端,我们从中获得三种不同类型的文件,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
对此的任何帮助都将非常感激。
答案 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