【问题标题】:MySQL Group By values equal values over multiple columns, output lookup value as field name, group by dateMySQL Group By值等于多列的值,输出查找值作为字段名,按日期分组
【发布时间】:2016-08-31 13:18:53
【问题描述】:

类似于MySQL Group By values that are equal over multiple columns

如何使用 MySQL 将下面的 mysql 数据库表转换为输出:

id entity_id volunteer_1 volunteer_2 volunteer_3
 1      1540        1933        1253        2543
 2      1638        2543        2123        1736
 3      1736        1253        1933        2123
 4      1834        1525        1253        2123
 5      1932        2123        2543        2451
 6      2030        2854        2451        1933
 7      2128        2451        2854        2543

到输出

              Jan-15 Feb-16 Mar-16
Actual Name 1      3      4      6
Actual Name 2      3      3      5
Actual Name 3      1      5      6

注意事项:

  1. 日期时间由链接到 activity.activity_date_time 的 entity_id 字段确定
  2. 每个志愿者ID都应该通过链接到字段中ID的contact.first_name和contact.last_name来输出实际姓名

【问题讨论】:

  • Date time is determined by entity_id field linking to an activity.activity_date_time 那是某种看不见的桌子吗?
  • 不是隐形的。相同的数据库。 4 位数字本身就是联系人表的外键 (contact.id)。
  • 那我们怎么看不到呢?
  • id first_name last_name 1540 实际姓名1 1638 实际姓名2

标签: mysql pivot-table


【解决方案1】:

通过首先进行联合来解决,以根据建议的答案获取数据(单列格式)。建议的答案不会合并来自多列的类似数据。然后,您可以使用临时结果并根据需要进行转换。此外,它必须是一个存储过程,该语句不会执行结果。

    DELIMITER $$
    DROP PROCEDURE IF EXISTS `civicrm_report_tmp_volunteer`$$

    CREATE PROCEDURE `civicrm_report_tmp_volunteer`()
    BEGIN
            DROP TABLE IF EXISTS civicrm_report_tmp_volunteer_hours;
            SET @group_concat_max_len = 5000;


            CREATE TEMPORARY TABLE civicrm_report_tmp_volunteer_hours AS 
            SELECT
                CONCAT(c.first_name, ' ' , c.last_name) as contact_name,
                a.contact_id as contact_id,
                EXTRACT( YEAR_MONTH FROM ca.activity_date_time ) as sort_date,
              CONCAT(
                    MONTHNAME(STR_TO_DATE(EXTRACT( MONTH FROM ca.activity_date_time), '%m')),
                    "-",
                    EXTRACT( YEAR FROM ca.activity_date_time )) as month_year,
                -- a.activity_id,
                -- ca.activity_type_id,
                -- ca.activity_date_time,
                -- ca.duration,
                SUM(ca.duration) as activity_duration,
                COUNT(DISTINCT (a.activity_id)) activity_count
            FROM
            (
              SELECT volunteer_1_543 as contact_id, entity_id as activity_id FROM civicrm_value_volunteer_details_103
              WHERE volunteer_1_543 IS NOT NULL
              UNION
              SELECT volunteer_2_544 as contact_id, entity_id as activity_id  FROM civicrm_value_volunteer_details_103
              WHERE volunteer_2_544 IS NOT NULL
              UNION
              SELECT volunteer_3_545 as contact_id, entity_id as activity_id  FROM civicrm_value_volunteer_details_103
              WHERE volunteer_3_545 IS NOT NULL
              UNION
              SELECT volunteer_4_546 as contact_id, entity_id as activity_id  FROM civicrm_value_volunteer_details_103
              WHERE volunteer_4_546 IS NOT NULL
            ) as a
            LEFT JOIN civicrm_activity ca
            ON a.activity_id = ca.id
            LEFT JOIN civicrm_contact c
            ON c.id = a.contact_id
            WHERE ca.activity_type_id IN (184)
            GROUP BY a.contact_id, month_year;

            SET @query = null;

            SELECT
              GROUP_CONCAT(DISTINCT
                CONCAT(
                  'MAX(IF(sort_date = ''',
                  sort_date,
                  ''', activity_duration, 0)) AS ',
                  "'", month_year, "' "
                )
              ) INTO @query
            FROM civicrm_report_tmp_volunteer_hours;

            SET @query = CONCAT('SELECT contact_name, ', @query , ' FROM civicrm_report_tmp_volunteer_hours GROUP BY contact_id');
            PREPARE stmt FROM @query;
            EXECUTE stmt;
            DEALLOCATE PREPARE stmt;
    END$$

    DELIMITER ;

    CALL civicrm_report_tmp_volunteer();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    • 2018-07-20
    • 2018-10-18
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 2021-06-29
    相关资源
    最近更新 更多