Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在具有SUM的多连接查询中包含DISTINCT_Mysql_Join_Sum_Distinct - Fatal编程技术网

Mysql 如何在具有SUM的多连接查询中包含DISTINCT

Mysql 如何在具有SUM的多连接查询中包含DISTINCT,mysql,join,sum,distinct,Mysql,Join,Sum,Distinct,下面的查询提供了几乎正确的计数,只是它包含了具有重复p.promo_代码和submitid值的行。如何使此查询使用不同的p.promo_代码submitid SELECT SUM(CASE WHEN ISNULL(p.promo_code) AND h.account_number = c2.account_number THEN 1 ELSE 0 END) as 'no_match_acct_match', SUM

下面的查询提供了几乎正确的计数,只是它包含了具有重复p.promo_代码和submitid值的行。如何使此查询使用不同的p.promo_代码submitid

SELECT
          SUM(CASE WHEN ISNULL(p.promo_code) 
                  AND h.account_number = c2.account_number THEN 1 ELSE 0 END) as  'no_match_acct_match',
          SUM(CASE WHEN ISNULL(p.promo_code) 
                  AND (h.account_number <> c2.account_number OR ISNULL(c2.account_number)) THEN 1 ELSE 0 END) as  'no_match',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name = CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date > @today THEN 1 ELSE 0 END) as 'future_name',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name = CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` = 'REDEEMED' THEN 1 ELSE 0 END) as 'redeemed_name',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name = CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` <> 'REDEEMED' 
                  AND p.end_date < @today
                  AND p.end_date + 259200 >= @today THEN 1 ELSE 0 END) as 'buffered_name',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name = CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` <> 'REDEEMED' 
                  AND p.end_date < @today
                  AND p.end_date + 259200 < @today THEN 1 ELSE 0 END) as 'expired_name',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name = CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` <> 'REDEEMED' 
                  AND p.end_date >= @today THEN 1 ELSE 0 END) as 'current_name',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name <> CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date > @today 
                  AND (r.resolve_status = 0 OR ISNULL(r.resolve_status)) THEN 1 ELSE 0 END) as 'future_noname',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name <> CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` = 'REDEEMED' THEN 1 ELSE 0 END) as 'redeemed_noname',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name <> CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` <> 'REDEEMED' 
                  AND p.end_date < @today
                  AND p.end_date + 259200 >= @today THEN 1 ELSE 0 END) as 'buffered_noname',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name <> CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` <> 'REDEEMED' 
                  AND p.end_date < @today
                  AND p.end_date + 259200 < @today THEN 1 ELSE 0 END) as 'expired_noname',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name <> CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` <> 'REDEEMED' 
                  AND p.end_date >= @today THEN 1 ELSE 0 END) as 'current_noname'
              FROM helpdesk h
              FORCE INDEX (help_status)
              LEFT JOIN promo_codes p
                  ON h.promo_code = p.promo_code
              LEFT JOIN customer_promocode cp
                  ON p.promo_code = cp.promo_code
              LEFT JOIN customers c
                  ON cp.customer_number = c.customer_number
              LEFT JOIN customers c2
                  ON h.account_number = c2.account_number
              LEFT OUTER JOIN redeem_queue r
                  ON p.promo_code = r.promo_code
              WHERE
                  h.help_status = 0
                  AND h.in_view_by = ''
                  AND (p.start_date  >= UNIX_TIMESTAMP(SUBDATE(CURDATE(), INTERVAL 1 YEAR))
                  OR p.start_date IS NULL) 
                  AND (ISNULL(p.promo_code) OR ISNULL(r.promo_code))
我尝试了一些我在SO上看到的用于单连接查询的解决方案,比如-sum*COUNTDISTINCT p.promo_代码,submitid/count*

SELECT
          SUM(CASE WHEN ISNULL(p.promo_code) 
                  AND h.account_number = c2.account_number THEN 1 ELSE 0 END) as  'no_match_acct_match',
          SUM(CASE WHEN ISNULL(p.promo_code) 
                  AND (h.account_number <> c2.account_number OR ISNULL(c2.account_number)) THEN 1 ELSE 0 END) as  'no_match',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name = CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date > @today THEN 1 ELSE 0 END) as 'future_name',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name = CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` = 'REDEEMED' THEN 1 ELSE 0 END) as 'redeemed_name',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name = CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` <> 'REDEEMED' 
                  AND p.end_date < @today
                  AND p.end_date + 259200 >= @today THEN 1 ELSE 0 END) as 'buffered_name',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name = CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` <> 'REDEEMED' 
                  AND p.end_date < @today
                  AND p.end_date + 259200 < @today THEN 1 ELSE 0 END) as 'expired_name',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name = CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` <> 'REDEEMED' 
                  AND p.end_date >= @today THEN 1 ELSE 0 END) as 'current_name',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name <> CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date > @today 
                  AND (r.resolve_status = 0 OR ISNULL(r.resolve_status)) THEN 1 ELSE 0 END) as 'future_noname',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name <> CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` = 'REDEEMED' THEN 1 ELSE 0 END) as 'redeemed_noname',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name <> CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` <> 'REDEEMED' 
                  AND p.end_date < @today
                  AND p.end_date + 259200 >= @today THEN 1 ELSE 0 END) as 'buffered_noname',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name <> CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` <> 'REDEEMED' 
                  AND p.end_date < @today
                  AND p.end_date + 259200 < @today THEN 1 ELSE 0 END) as 'expired_noname',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name <> CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` <> 'REDEEMED' 
                  AND p.end_date >= @today THEN 1 ELSE 0 END) as 'current_noname'
              FROM helpdesk h
              FORCE INDEX (help_status)
              LEFT JOIN promo_codes p
                  ON h.promo_code = p.promo_code
              LEFT JOIN customer_promocode cp
                  ON p.promo_code = cp.promo_code
              LEFT JOIN customers c
                  ON cp.customer_number = c.customer_number
              LEFT JOIN customers c2
                  ON h.account_number = c2.account_number
              LEFT OUTER JOIN redeem_queue r
                  ON p.promo_code = r.promo_code
              WHERE
                  h.help_status = 0
                  AND h.in_view_by = ''
                  AND (p.start_date  >= UNIX_TIMESTAMP(SUBDATE(CURDATE(), INTERVAL 1 YEAR))
                  OR p.start_date IS NULL) 
                  AND (ISNULL(p.promo_code) OR ISNULL(r.promo_code))
不走运。 以下是完整的查询:

SELECT
          SUM(CASE WHEN ISNULL(p.promo_code) 
                  AND h.account_number = c2.account_number THEN 1 ELSE 0 END) as  'no_match_acct_match',
          SUM(CASE WHEN ISNULL(p.promo_code) 
                  AND (h.account_number <> c2.account_number OR ISNULL(c2.account_number)) THEN 1 ELSE 0 END) as  'no_match',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name = CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date > @today THEN 1 ELSE 0 END) as 'future_name',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name = CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` = 'REDEEMED' THEN 1 ELSE 0 END) as 'redeemed_name',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name = CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` <> 'REDEEMED' 
                  AND p.end_date < @today
                  AND p.end_date + 259200 >= @today THEN 1 ELSE 0 END) as 'buffered_name',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name = CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` <> 'REDEEMED' 
                  AND p.end_date < @today
                  AND p.end_date + 259200 < @today THEN 1 ELSE 0 END) as 'expired_name',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name = CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` <> 'REDEEMED' 
                  AND p.end_date >= @today THEN 1 ELSE 0 END) as 'current_name',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name <> CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date > @today 
                  AND (r.resolve_status = 0 OR ISNULL(r.resolve_status)) THEN 1 ELSE 0 END) as 'future_noname',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name <> CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` = 'REDEEMED' THEN 1 ELSE 0 END) as 'redeemed_noname',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name <> CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` <> 'REDEEMED' 
                  AND p.end_date < @today
                  AND p.end_date + 259200 >= @today THEN 1 ELSE 0 END) as 'buffered_noname',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name <> CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` <> 'REDEEMED' 
                  AND p.end_date < @today
                  AND p.end_date + 259200 < @today THEN 1 ELSE 0 END) as 'expired_noname',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name <> CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` <> 'REDEEMED' 
                  AND p.end_date >= @today THEN 1 ELSE 0 END) as 'current_noname'
              FROM helpdesk h
              FORCE INDEX (help_status)
              LEFT JOIN promo_codes p
                  ON h.promo_code = p.promo_code
              LEFT JOIN customer_promocode cp
                  ON p.promo_code = cp.promo_code
              LEFT JOIN customers c
                  ON cp.customer_number = c.customer_number
              LEFT JOIN customers c2
                  ON h.account_number = c2.account_number
              LEFT OUTER JOIN redeem_queue r
                  ON p.promo_code = r.promo_code
              WHERE
                  h.help_status = 0
                  AND h.in_view_by = ''
                  AND (p.start_date  >= UNIX_TIMESTAMP(SUBDATE(CURDATE(), INTERVAL 1 YEAR))
                  OR p.start_date IS NULL) 
                  AND (ISNULL(p.promo_code) OR ISNULL(r.promo_code))
它运行得很快,解释计划看起来不错,但由于数据重复,目前有2个计数关闭

SELECT
          SUM(CASE WHEN ISNULL(p.promo_code) 
                  AND h.account_number = c2.account_number THEN 1 ELSE 0 END) as  'no_match_acct_match',
          SUM(CASE WHEN ISNULL(p.promo_code) 
                  AND (h.account_number <> c2.account_number OR ISNULL(c2.account_number)) THEN 1 ELSE 0 END) as  'no_match',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name = CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date > @today THEN 1 ELSE 0 END) as 'future_name',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name = CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` = 'REDEEMED' THEN 1 ELSE 0 END) as 'redeemed_name',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name = CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` <> 'REDEEMED' 
                  AND p.end_date < @today
                  AND p.end_date + 259200 >= @today THEN 1 ELSE 0 END) as 'buffered_name',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name = CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` <> 'REDEEMED' 
                  AND p.end_date < @today
                  AND p.end_date + 259200 < @today THEN 1 ELSE 0 END) as 'expired_name',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name = CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` <> 'REDEEMED' 
                  AND p.end_date >= @today THEN 1 ELSE 0 END) as 'current_name',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name <> CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date > @today 
                  AND (r.resolve_status = 0 OR ISNULL(r.resolve_status)) THEN 1 ELSE 0 END) as 'future_noname',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name <> CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` = 'REDEEMED' THEN 1 ELSE 0 END) as 'redeemed_noname',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name <> CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` <> 'REDEEMED' 
                  AND p.end_date < @today
                  AND p.end_date + 259200 >= @today THEN 1 ELSE 0 END) as 'buffered_noname',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name <> CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` <> 'REDEEMED' 
                  AND p.end_date < @today
                  AND p.end_date + 259200 < @today THEN 1 ELSE 0 END) as 'expired_noname',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name <> CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` <> 'REDEEMED' 
                  AND p.end_date >= @today THEN 1 ELSE 0 END) as 'current_noname'
              FROM helpdesk h
              FORCE INDEX (help_status)
              LEFT JOIN promo_codes p
                  ON h.promo_code = p.promo_code
              LEFT JOIN customer_promocode cp
                  ON p.promo_code = cp.promo_code
              LEFT JOIN customers c
                  ON cp.customer_number = c.customer_number
              LEFT JOIN customers c2
                  ON h.account_number = c2.account_number
              LEFT OUTER JOIN redeem_queue r
                  ON p.promo_code = r.promo_code
              WHERE
                  h.help_status = 0
                  AND h.in_view_by = ''
                  AND (p.start_date  >= UNIX_TIMESTAMP(SUBDATE(CURDATE(), INTERVAL 1 YEAR))
                  OR p.start_date IS NULL) 
                  AND (ISNULL(p.promo_code) OR ISNULL(r.promo_code))

感谢您提供的任何帮助。

您应该在这些列上使用group by

SELECT
          SUM(CASE WHEN ISNULL(p.promo_code) 
                  AND h.account_number = c2.account_number THEN 1 ELSE 0 END) as  'no_match_acct_match',
          SUM(CASE WHEN ISNULL(p.promo_code) 
                  AND (h.account_number <> c2.account_number OR ISNULL(c2.account_number)) THEN 1 ELSE 0 END) as  'no_match',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name = CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date > @today THEN 1 ELSE 0 END) as 'future_name',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name = CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` = 'REDEEMED' THEN 1 ELSE 0 END) as 'redeemed_name',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name = CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` <> 'REDEEMED' 
                  AND p.end_date < @today
                  AND p.end_date + 259200 >= @today THEN 1 ELSE 0 END) as 'buffered_name',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name = CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` <> 'REDEEMED' 
                  AND p.end_date < @today
                  AND p.end_date + 259200 < @today THEN 1 ELSE 0 END) as 'expired_name',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name = CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` <> 'REDEEMED' 
                  AND p.end_date >= @today THEN 1 ELSE 0 END) as 'current_name',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name <> CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date > @today 
                  AND (r.resolve_status = 0 OR ISNULL(r.resolve_status)) THEN 1 ELSE 0 END) as 'future_noname',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name <> CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` = 'REDEEMED' THEN 1 ELSE 0 END) as 'redeemed_noname',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name <> CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` <> 'REDEEMED' 
                  AND p.end_date < @today
                  AND p.end_date + 259200 >= @today THEN 1 ELSE 0 END) as 'buffered_noname',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name <> CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` <> 'REDEEMED' 
                  AND p.end_date < @today
                  AND p.end_date + 259200 < @today THEN 1 ELSE 0 END) as 'expired_noname',
          SUM(CASE WHEN p.promo_code IS NOT NULL 
                  AND c.full_name <> CONCAT(h.firstname,' ',h.lastname) 
                  AND p.start_date <= @today 
                  AND p.`status` <> 'REDEEMED' 
                  AND p.end_date >= @today THEN 1 ELSE 0 END) as 'current_noname'
              FROM helpdesk h
              FORCE INDEX (help_status)
              LEFT JOIN promo_codes p
                  ON h.promo_code = p.promo_code
              LEFT JOIN customer_promocode cp
                  ON p.promo_code = cp.promo_code
              LEFT JOIN customers c
                  ON cp.customer_number = c.customer_number
              LEFT JOIN customers c2
                  ON h.account_number = c2.account_number
              LEFT OUTER JOIN redeem_queue r
                  ON p.promo_code = r.promo_code
              WHERE
                  h.help_status = 0
                  AND h.in_view_by = ''
                  AND (p.start_date  >= UNIX_TIMESTAMP(SUBDATE(CURDATE(), INTERVAL 1 YEAR))
                  OR p.start_date IS NULL) 
                  AND (ISNULL(p.promo_code) OR ISNULL(r.promo_code))
SELECT
  SUM(
    CASE WHEN ISNULL(p.promo_code)
    AND h.account_number = c2.account_number THEN 1 ELSE 0 END
  ) as 'no_match_acct_match',
  SUM(
    CASE WHEN ISNULL(p.promo_code)
    AND (
      h.account_number <> c2.account_number
      OR ISNULL(c2.account_number)
    ) THEN 1 ELSE 0 END
  ) as 'no_match',
  SUM(
    CASE WHEN p.promo_code IS NOT NULL
    AND c.full_name = CONCAT(h.firstname, ' ', h.lastname)
    AND p.start_date > @today THEN 1 ELSE 0 END
  ) as 'future_name',
  SUM(
    CASE WHEN p.promo_code IS NOT NULL
    AND c.full_name = CONCAT(h.firstname, ' ', h.lastname)
    AND p.start_date <= @today
    AND p.`status` = 'REDEEMED' THEN 1 ELSE 0 END
  ) as 'redeemed_name',
  SUM(
    CASE WHEN p.promo_code IS NOT NULL
    AND c.full_name = CONCAT(h.firstname, ' ', h.lastname)
    AND p.start_date <= @today
    AND p.`status` <> 'REDEEMED'
    AND p.end_date < @today
    AND p.end_date + 259200 >= @today THEN 1 ELSE 0 END
  ) as 'buffered_name',
  SUM(
    CASE WHEN p.promo_code IS NOT NULL
    AND c.full_name = CONCAT(h.firstname, ' ', h.lastname)
    AND p.start_date <= @today
    AND p.`status` <> 'REDEEMED'
    AND p.end_date < @today
    AND p.end_date + 259200 < @today THEN 1 ELSE 0 END
  ) as 'expired_name',
  SUM(
    CASE WHEN p.promo_code IS NOT NULL
    AND c.full_name = CONCAT(h.firstname, ' ', h.lastname)
    AND p.start_date <= @today
    AND p.`status` <> 'REDEEMED'
    AND p.end_date >= @today THEN 1 ELSE 0 END
  ) as 'current_name',
  SUM(
    CASE WHEN p.promo_code IS NOT NULL
    AND c.full_name <> CONCAT(h.firstname, ' ', h.lastname)
    AND p.start_date > @today
    AND (
      r.resolve_status = 0
      OR ISNULL(r.resolve_status)
    ) THEN 1 ELSE 0 END
  ) as 'future_noname',
  SUM(
    CASE WHEN p.promo_code IS NOT NULL
    AND c.full_name <> CONCAT(h.firstname, ' ', h.lastname)
    AND p.start_date <= @today
    AND p.`status` = 'REDEEMED' THEN 1 ELSE 0 END
  ) as 'redeemed_noname',
  SUM(
    CASE WHEN p.promo_code IS NOT NULL
    AND c.full_name <> CONCAT(h.firstname, ' ', h.lastname)
    AND p.start_date <= @today
    AND p.`status` <> 'REDEEMED'
    AND p.end_date < @today
    AND p.end_date + 259200 >= @today THEN 1 ELSE 0 END
  ) as 'buffered_noname',
  SUM(
    CASE WHEN p.promo_code IS NOT NULL
    AND c.full_name <> CONCAT(h.firstname, ' ', h.lastname)
    AND p.start_date <= @today
    AND p.`status` <> 'REDEEMED'
    AND p.end_date < @today
    AND p.end_date + 259200 < @today THEN 1 ELSE 0 END
  ) as 'expired_noname',
  SUM(
    CASE WHEN p.promo_code IS NOT NULL
    AND c.full_name <> CONCAT(h.firstname, ' ', h.lastname)
    AND p.start_date <= @today
    AND p.`status` <> 'REDEEMED'
    AND p.end_date >= @today THEN 1 ELSE 0 END
  ) as 'current_noname'
FROM
  helpdesk h FORCE INDEX (help_status)
  LEFT JOIN promo_codes p ON h.promo_code = p.promo_code
  LEFT JOIN customer_promocode cp ON p.promo_code = cp.promo_code
  LEFT JOIN customers c ON cp.customer_number = c.customer_number
  LEFT JOIN customers c2 ON h.account_number = c2.account_number
  LEFT OUTER JOIN redeem_queue r ON p.promo_code = r.promo_code
WHERE
  h.help_status = 0
  AND h.in_view_by = ''
  AND (
    p.start_date >= UNIX_TIMESTAMP(SUBDATE(CURDATE(), INTERVAL 1 YEAR))
    OR p.start_date IS NULL
  )
  AND (
    ISNULL(p.promo_code)
    OR ISNULL(r.promo_code)
  )
group by
  p.promo_code,
  submitid

在没有数据的情况下要消化的SQL太多了,但是您是否尝试过使用p.promo_代码进行分组?请注意,由于你的总数中有一个案例,我不能100%确定你是否在寻找Hanks@charmeleon,但使用group by会将每个促销代码的数据打破成一个记录。此查询正在获取每个案例的总和。我知道在没有数据的情况下,要看和理解它是很困难的。如果我不能很快找到答案,或者在这里找不到解决方案,我将发布DDL以及每个表中的少量数据采样。