2014-08-29 118 views
2

季度日期优秀的公司结果,我有一个表'QuarterlyReport'其中有多个公司的季度利润数字与下面的列'CompanyName''QuarterEndDate' & 'Profit'过滤掉基于MySQL的

 
|CompanyName|QuarterEndDate|Profit| 
|---------------------------------| 
|A   |2013-06-30 |29878 | 
|A   |2013-09-30 |33712 | 
|A   |2013-12-31 |60764 | 
|A   |2014-03-31 |260734| 
|B   |2013-06-30 |-1234 | 
|B   |2013-09-30 |0  | 
|B   |2013-12-31 |20114 | 
|B   |2014-03-31 |-984 | 
... 

我试图构建一个MySQL查询看看哪个公司的利润表现每隔一个季度(Q4> Q3> Q2> Q1)就会有所增加,并有1年(4个季度)的日期范围。

:在实施例以上的情况下,只有公司“A”将满足这一要求,并应返回的查询结果

目前我只能够构建查询(Q4> 0 AND Q3> 0 AND Q2 > 0)使用关注MySQL查询:

SELECT * FROM (SELECT q.CompanyName, q.QuarterEndDate, q.Profit FROM `QuarterlyReport` q) a 
WHERE a.QuarterEndDate >= '2013-06-30' AND 
a.QuarterEndDate < '2014-06-30' AND 
a.CompanyName IN (SELECT CompanyName FROM `QuarterlyReport` WHERE 
a.CompanyName IN (SELECT Q4.CompanyName FROM `QuarterlyReport` AS Q4 WHERE Q4.QuarterEndDate = '2014-03-31' AND Q4.Profit > '0') AND 
a.CompanyName IN (SELECT Q3.CompanyName FROM `QuarterlyReport` AS Q3 WHERE Q3.QuarterEndDate = '2013-12-31' AND Q3.Profit > '0') AND 
a.CompanyName IN (SELECT Q2.CompanyName FROM `QuarterlyReport` AS Q2 WHERE Q2.QuarterEndDate = '2013-09-30' AND Q2.Profit > '0') AND 
a.CompanyName IN (SELECT Q1.CompanyName FROM `QuarterlyReport` AS Q1 WHERE Q1.QuarterEndDate = '2013-06-30' AND Q1.Profit > '0') 
GROUP BY a.CompanyName ORDER BY a.CompanyName ASC 

任何人都可以提出一些想法,如何存档我的目标查询?

回答

2

你可以做

SELECT * 
    FROM 
(
    SELECT CompanyName, 
     MAX(CASE WHEN QUARTER(QuarterEndDate) = 2 THEN Profit END) q1, 
     MAX(CASE WHEN QUARTER(QuarterEndDate) = 3 THEN Profit END) q2, 
     MAX(CASE WHEN QUARTER(QuarterEndDate) = 4 THEN Profit END) q3, 
     MAX(CASE WHEN QUARTER(QuarterEndDate) = 1 THEN Profit END) q4 
    FROM QuarterlyReport 
    WHERE QuarterEndDate >= '2013-06-30' AND QuarterEndDate < '2014-06-30' 
    GROUP BY CompanyName 
) q 
WHERE q1 < q2 AND q2 < q3 AND q3 < q4 

输出:

 
| COMPANYNAME | Q1 | Q2 | Q3 |  Q4 | 
|-------------|-------|-------|-------|--------| 
|   A | 29878 | 33712 | 60764 | 260734 | 

下面是SQLFiddle演示

+0

这是一个非常effici ent查询命令并且很容易修改以适应其他过滤要求! – Dennis 2014-08-29 06:59:41

0

尝试:

select q.* 
from quarterlyreport q 
join 
    (
    select  companyname 
    from  quarterlyreport 
    where  quarterenddate between '2013-06-30' and '2014-06-30' 
    group by companyname 
    having  sum(case when quarter(quarterenddate) = 1 then profit else 0 end) 
       > sum(case when quarter(quarterenddate) = 4 then profit else 0 end) 
      and sum(case when quarter(quarterenddate) = 4 then profit else 0 end) 
       > sum(case when quarter(quarterenddate) = 3 then profit else 0 end) 
      and sum(case when quarter(quarterenddate) = 3 then profit else 0 end) 
       > sum(case when quarter(quarterenddate) = 2 then profit else 0 end) 
    ) v 
    on q.companyname = v.companyname