1

我有一个包含俱乐部会员信息的数据库。每个成员在任何时候都可以是三种不同状态之一(活跃、老手、助理)。我把它分解成三个表。包含所有成员信息的成员表,包含 status_name 和 status_id 的状态表以及包含 member_id、status_id、date_from 和 date_to 的网格表。

我正在尝试计算成员在每个状态上花费的时间。我目前正在通过以下查询计算成员处于“活动”状态的总时间:

SELECT first_name, last_name, 
 (DATE_FORMAT( FROM_DAYS( SUM( DATEDIFF( IFNULL( q.date_to, NOW() ) , q.date_from ) ) ) , "%Y" ) +0) as service_years 
 FROM member a
 LEFT JOIN member_status q on a.id = q.member_id AND q.status_id = 1
 GROUP BY a.id

我知道我可以通过在左连接中去掉 AND 来提取该人成为成员的总时间,但是我无法找到一种方法来计算单个查询中每个状态的时间。

我的理想结果将是:

 -----------------------------------------------------------
 |member_name | active_years | veteran_years | total_years |
 -----------------------------------------------------------
 |name        | 5            | 5             | 10          |
 -----------------------------------------------------------

有没有办法在单个查询中完成我正在寻找的内容?

4

2 回答 2

0

你应该能够做这样的事情,它使用一个CASE语句来确定状态名称,然后根据状态计算总年数:

SELECT first_name, 
  last_name, 
  CASE WHEN status_name = 'active' 
    then (DATE_FORMAT( FROM_DAYS( SUM( DATEDIFF( IFNULL( q.date_to, NOW() ) , q.date_from ) ) ) , "%Y" ) +0) end as active_years,
  CASE WHEN status_name = 'veteran' 
    then (DATE_FORMAT( FROM_DAYS( SUM( DATEDIFF( IFNULL( q.date_to, NOW() ) , q.date_from ) ) ) , "%Y" ) +0) end as active_years,
  (DATE_FORMAT( FROM_DAYS( SUM( DATEDIFF( IFNULL( q.date_to, NOW() ) , q.date_from ) ) ) , "%Y" ) +0) as total_years,
FROM member a
LEFT JOIN member_status q 
  on a.id = q.member_id 
  AND q.status_id = 1
GROUP BY a.id, a.first_name, a.last_name

如果您发布一些示例数据,则更容易确定正确的查询

于 2012-10-03T14:02:40.927 回答
0

假设 1=active 和 2=veteran,这样的事情应该可以工作:

SELECT first_name, last_name, 
 (DATE_FORMAT( FROM_DAYS( SUM( case when q.status_id = 1 then DATEDIFF( IFNULL( q.date_to, NOW() ) , q.date_from ) ) else 0 end ) , "%Y" ) +0) as active_years,
 (DATE_FORMAT( FROM_DAYS( SUM( case when q.status_id = 2 then DATEDIFF( IFNULL( q.date_to, NOW() ) , q.date_from ) ) else 0 end ) , "%Y" ) +0) as veteran_years,
(DATE_FORMAT( FROM_DAYS( SUM( DATEDIFF( IFNULL( q.date_to, NOW() ) , q.date_from ) ) ) , "%Y" ) +0) as total_years 
 FROM member a
  LEFT JOIN member_status q on a.id = q.member_id AND q.status_id in (1,2)
 GROUP BY a.id

另一种选择是多次加入 member_status 表。

于 2012-10-03T14:05:14.253 回答