如果月份相同,PHP会在相同的行中获得结果

时间:2017-05-17 15:38:54

标签: php mysql join union

如果月份相同,我面临一个问题,即将结果排在同一行。我在查询中使用UNION ALL。任何人都可以根据我的要求建议如何使用查询来获得结果。

我正在使用以下代码:

SELECT 
   SUM(amount) AS amount,
   DATE_FORMAT(rcvdate,'%M %Y') as rcv,
   NULL AS recovery 
FROM `advertisercv` 
GROUP BY DATE_FORMAT(rcvdate, '%M %Y')
UNION ALL 
SELECT 
   NULL,
   DATE_FORMAT(date,'%M %Y') AS rcv,
   SUM(amount) 
FROM `paymentsrec` 
GROUP BY DATE_FORMAT(date, '%M %Y') 
ORDER BY rcv

sample data

1 个答案:

答案 0 :(得分:0)

你有

SELECT
  SUM(amount) as amount,
  DATE_FORMAT(rcvdate,'%M %Y') as rcv,
  null as recovery 
FROM `advertisercv` 
GROUP BY DATE_FORMAT(rcvdate, '%M %Y')
UNION all 
SELECT 
  null,
  DATE_FORMAT(date,'%M %Y') as rcv,
  SUM(amount) 
FROM `paymentsrec`
GROUP BY DATE_FORMAT(date, '%M %Y') 
order by rcv

为了使这更容易使用,我强烈建议为每个子选择赋予列相同的名称:

SELECT
  SUM(amount) as amount,
  DATE_FORMAT(rcvdate,'%M %Y') as rcv,
  null as recovery 
FROM `advertisercv` 
GROUP BY DATE_FORMAT(rcvdate, '%M %Y')
UNION all 
SELECT 
  null as amount,
  DATE_FORMAT(date,'%M %Y') as rcv,
  SUM(amount) as recovery
FROM `paymentsrec`
GROUP BY DATE_FORMAT(date, '%M %Y') 
order by rcv

现在您可以看到您将获得包含amount,rcv,recovery的多行。您希望这些行按rcv分组:

SELECT * FROM (
  SELECT
    SUM(amount) as amount,
    DATE_FORMAT(rcvdate,'%M %Y') as rcv,
    null as recovery 
  FROM `advertisercv` 
  GROUP BY DATE_FORMAT(rcvdate, '%M %Y')
  UNION all 
  SELECT 
    null as amount,
    DATE_FORMAT(date,'%M %Y') as rcv,
    SUM(amount) as recovery
  FROM `paymentsrec`
  GROUP BY DATE_FORMAT(date, '%M %Y') 
  order by rcv
) GROUP BY rcv

但是,*不是集团运营商。当我们有多个具有相同rcv的行时,我们该怎么办?你可以总结一下。你可以得到最大或最小。你表达问题的方式,看起来你想要合并 - 第一个非空值。

SELECT
  rcv,
  COALESCE(amount) as amount,
  COALESCE(recover) as recovery
FROM (
  SELECT
    SUM(amount) as amount,
    DATE_FORMAT(rcvdate,'%M %Y') as rcv,
    null as recovery 
  FROM `advertisercv` 
  GROUP BY DATE_FORMAT(rcvdate, '%M %Y')
  UNION all 
  SELECT 
    null as amount,
    DATE_FORMAT(date,'%M %Y') as rcv,
    SUM(amount) as recovery
  FROM `paymentsrec`
  GROUP BY DATE_FORMAT(date, '%M %Y') 
  order by rcv
) GROUP BY rcv

现在,每个rcv值将获得一行,并且金额和恢复将包含每个rcv值的第一个非空值。