内部联接不起作用的MYSQL计数

内部联接不起作用的MYSQL计数,mysql,Mysql,我有两张桌子 1) 外展 2) 。联系 id outreach_id start_date created_at cost status ----------------------------------------------------------------------- 1 1 2016-12-01 00:00:00 2016-12-07 00:00:00 100.00 Approved 2 1

我有两张桌子

1) 外展

2) 。联系

id  outreach_id  start_date             created_at        cost    status
-----------------------------------------------------------------------
1    1           2016-12-01 00:00:00  2016-12-07 00:00:00  100.00  Approved
2    1           2016-12-02 00:00:00  2016-12-09 00:00:00  120.00  Approved
3    1           NUll                 2016-12-28 00:00:00  20.00   Pending
4    1           2016-12-05 00:00:00  2016-12-10 00:00:00  35.00   Approved
5    1           2016-12-07 00:00:00  2016-12-13 00:00:00  10.00   Approved
6    2           2016-12-10 00:00:00  2016-12-15 00:00:00  10.00   Pending
7    2           2016-12-13 00:00:00  2016-12-18 00:00:00  10.00   Approved
8    2           2016-12-01 00:00:00  2016-12-28 00:00:00  10.00   Pending
9    2           2016-12-04 00:00:00  2016-12-21 00:00:00  10.00   Approved
10   2           2016-12-09 00:00:00  2016-12-22 00:00:00  15.00   Pending
我正在尝试按月/年进行计数,我认为它可行,但我认为它不可行,因为“profile_id”问题。我的问题如下:

select monthname(date) as Month,  year(date) as Year,  month(date) as Mn, UNIX_TIMESTAMP(CONCAT(year(date),"-",month(date),"-","01")) as tt,
(select count(*) from outreach_links where year(outreach_links.created_at) = year and month(outreach_links.created_at) = month and status = "Pending" and created_at>="2016-12-01 00:00:00" and created_at<="2016-12-31 00:00:00") as pp,
(select count(*) from outreach_links where year(outreach_links.start_date) = year and month(outreach_links.start_date) = month and status = "Approved" and start_date>="2016-12-01 00:00:00" and start_date<="2016-12-31 00:00:00") as aa,
(select sum(cost) from outreach_links where year(outreach_links.start_date) = year and month(outreach_links.start_date) = month and status = "Approved" and start_date>="2016-12-01 00:00:00" and start_date<="2016-12-31 00:00:00") as cc
from
(select year(outreach_links.created_at) as year, month(outreach_links.created_at) as month, outreach_links.created_at as date 
from outreach_links 
inner join outreach on outreach.id = outreach_links.outreach_id
where outreach_links.created_at>="2016-12-01 00:00:00" and outreach_links.created_at<="2016-12-31 00:00:00" and outreach.profile_id=2
union
select year(outreach_links.start_date) as year, month(outreach_links.start_date) as month, outreach_links.start_date as date
from outreach_links 
inner join outreach on outreach.id = outreach_id
where start_date>="2016-12-01 00:00:00" and start_date<="2016-12-31 00:00:00" and outreach.profile_id=2 ) t1
group by year, month
order by date
这是错误的,它应该只计算profile_id=2,这里是我想要的输出:

如您所见,这3个计数是错误的,它们假定为: “pp”:“1” “aa”:“4” “抄送”:“265.00”

以下是我想要的:

1). **"pp" is Total Pending** Count when status="Pending" based on created_at
2). **"aa" is Total Approved** Count when status="Approved" based on start_date 
3). **"cc" is Total Cost** Sum of All cost when Status="Approved" and based on start_date
4). Group by Month & Year of the user imputed Date Range
这是一个SQLFIDDLE>>

你能帮我修一下吗


谢谢

我想你想要这样的东西:

 SELECT MONTHNAME(d.date)  AS Month
      , YEAR(d.date)       AS Year
      , MONTH(d.date)      AS Mn
      , SUM(IF(l.status = 'Pending'  AND l.created_at >= d.date AND l.created_at < d.date + INTERVAL 1 MONTH ,1     ,0)) AS pp
      , SUM(IF(l.status = 'Approved' AND l.start_date >= d.date AND l.start_date < d.date + INTERVAL 1 MONTH ,1     ,0)) AS aa
      , SUM(IF(l.status = 'Approved' AND l.start_date >= d.date AND l.start_date < d.date + INTERVAL 1 MONTH ,l.cost,0)) AS cc
   FROM ( SELECT '2016-12-01' + INTERVAL 0 MONTH AS date ) d
   JOIN outreach o
     ON o.profile_id = 2
   LEFT
   JOIN outreach_links l
     ON l.outreach_id = o.id
    AND (  (     l.start_date >= d.date + INTERVAL 0 MONTH
             AND l.start_date <  d.date + INTERVAL 1 MONTH
           )
        OR (     l.created_at >= d.date + INTERVAL 0 MONTH
             AND l.created_at <  d.date + INTERVAL 1 MONTH
           )
        )
  GROUP BY d.date

interval的作用是什么?我需要保留输入的两个日期,这些日期可能会改变,不需要一个月,我可以输入2016-12-01到2016-12-15或任何其他日期,它将包括第二个版本,允许提供结束日期。外部查询引用内联视图
d
返回的值,因此两个日期值在查询中只提供一次,而不是多次。你能用简单的语言描述一下你想计算、汇总什么吗。?仅仅看这个查询就很难理解。有三件事需要考虑:1。如果在开始日期2之间,则批准的总数。基于创建日期范围3的待决总数。总成本仅基于状态批准时,以及输入范围和所有这些之间的开始日期。只需输入配置文件_id,注意日期范围可能会因给定用户而改变。我希望按月份和年份对它们进行分组,与输出阵列相同。现在更清楚了吗?看,我将做一个SQL小提琴,使它更清楚它应该是简单的
array:1 [▼
  0 => {#394 ▼
    +"Month": "December"
    +"Year": "2016"
    +"Mn": "12"
    +"tt": "1480568400.000000"
    +"pp": "1"
    +"aa": "4"
    +"cc": "265.00"
  }
]
1). **"pp" is Total Pending** Count when status="Pending" based on created_at
2). **"aa" is Total Approved** Count when status="Approved" based on start_date 
3). **"cc" is Total Cost** Sum of All cost when Status="Approved" and based on start_date
4). Group by Month & Year of the user imputed Date Range
 SELECT MONTHNAME(d.date)  AS Month
      , YEAR(d.date)       AS Year
      , MONTH(d.date)      AS Mn
      , SUM(IF(l.status = 'Pending'  AND l.created_at >= d.date AND l.created_at < d.date + INTERVAL 1 MONTH ,1     ,0)) AS pp
      , SUM(IF(l.status = 'Approved' AND l.start_date >= d.date AND l.start_date < d.date + INTERVAL 1 MONTH ,1     ,0)) AS aa
      , SUM(IF(l.status = 'Approved' AND l.start_date >= d.date AND l.start_date < d.date + INTERVAL 1 MONTH ,l.cost,0)) AS cc
   FROM ( SELECT '2016-12-01' + INTERVAL 0 MONTH AS date ) d
   JOIN outreach o
     ON o.profile_id = 2
   LEFT
   JOIN outreach_links l
     ON l.outreach_id = o.id
    AND (  (     l.start_date >= d.date + INTERVAL 0 MONTH
             AND l.start_date <  d.date + INTERVAL 1 MONTH
           )
        OR (     l.created_at >= d.date + INTERVAL 0 MONTH
             AND l.created_at <  d.date + INTERVAL 1 MONTH
           )
        )
  GROUP BY d.date
 SELECT MONTHNAME(d.date)  AS Month
      , YEAR(d.date)       AS Year
      , MONTH(d.date)      AS Mn
      , SUM(IF(l.status = 'Pending'  AND l.created_at >= d.date AND l.created_at < d.end_date,1     ,0)) AS pp
      , SUM(IF(l.status = 'Approved' AND l.start_date >= d.date AND l.start_date < d.end_date,1     ,0)) AS aa
      , SUM(IF(l.status = 'Approved' AND l.start_date >= d.date AND l.start_date < d.end_date,l.cost,0)) AS cc
   FROM ( SELECT '2016-12-01' + INTERVAL 0 MONTH AS date
               , '2016-12-16' + INTERVAL 0 MONTH AS end_date
         ) d
   JOIN outreach o
     ON o.profile_id = 2
   LEFT
   JOIN outreach_links l
     ON l.outreach_id = o.id
    AND (  (     l.start_date >= d.date
             AND l.start_date <  d.end_date
           )
        OR (     l.created_at >= d.date
             AND l.created_at <  d.end_date
           )
        )
  GROUP BY d.date, d.end_date