2013-05-18 252 views
2

我的SQL查询有以下问题。我成功地执行了大约15个,但这个让我感到恶心。这甚至很难翻译,但可能你会明白。SQL复杂查询

显示年和月数和他们的那些个“借来的时间”,其中的成本总和每月在2006年

是较小的则在2,3月份的最大单和成本总和,这是我至今(一个查询的版本,因为我试过很多人)

SELECT EXTRACT(MONTH FROM DATA_WYP), SUM(KOSZT) 
FROM WYPOZYCZENIA 
WHERE KOSZT<(SELECT SUM(KOSZT) 
      FROM WYPOZYCZENIA 
      WHERE SUM(KOSZT)<(SELECT MAX(SUM(KOSZT)) 
           FROM WYPOZYCZENIA 
           WHERE EXTRACT(MONTH FROM DATA_WYP)='2' OR 
           EXTRACT(MONTH FROM DATA_WYP)='3' 
           GROUP BY EXTRACT(MONTH FROM DATA_WYP))) 
GROUP BY EXTRACT(MONTH FROM DATA_WYP); 

的问题是,我不能等于SUM(KOSZT),试图用AS救他们,但它也不起作用。

请帮助我,因为它已经毁了我的一天。

在此先感谢。

+0

如果这是我的SQL使用不得不比较分组项(总和等) – exussum

+3

您使用的是什么RDBMS? – peterm

回答

3

要根据SQL查询中的聚合函数的结果进行过滤,请将比较置于HAVING语句中。

+0

+1;但不要让Joe Celko看到你的咆哮;出于某种原因,他相信完全相反。 –

0

我假设Oracle或DB2是因为示例查询中的关键字。

使用CTE找到2个月的最大值,并使用HAVING作为条件简化了表达式,这应该(或多或少)做你所需要的;

WITH cte AS (
    SELECT SUM(KOSZT) mx FROM WYPOZYCZENIA 
    WHERE EXTRACT(MONTH FROM DATA_WYP) IN ('2','3') 
    AND EXTRACT(YEAR FROM DATA_WYP) = '2006' 
    GROUP BY EXTRACT(MONTH FROM DATA_WYP) 
) 
SELECT EXTRACT(YEAR FROM DATA_WYP) Year, EXTRACT(MONTH FROM DATA_WYP) Month, 
     SUM(KOSZT) KOSZT 
FROM WYPOZYCZENIA 
GROUP BY EXTRACT(Year FROM DATA_WYP), EXTRACT(Month FROM DATA_WYP) 
HAVING SUM(KOSZT) < (SELECT MAX(mx) FROM cte) 

An SQLfiddle to test with

0

你在找这样的吗?

SELECT YEAR(data_wyp) year, 
     MONTH(data_wyp) month, 
     SUM(koszt) koszt 
    FROM wypozyczenia 
GROUP BY year, month 
HAVING koszt < (SELECT SUM(koszt) koszt 
         FROM wypozyczenia 
         WHERE MONTH(data_wyp) IN (2, 3) 
         AND YEAR(data_wyp) = 2006 
         GROUP BY MONTH(data_wyp) 
         ORDER BY koszt DESC LIMIT 1) 

SQLFiddle(MySQL的)

0

试试这个OUT-:

选择提取物(一年DATA_WYP)
           提取物(一个月DATA_WYP)
            SUM(KOSZT)
FROM WYPOZYCZENIA
GROUP BY EXTRACT(YEAR FROM DATA_WYP)
                  EXTRACT(一个月DATA_WYP)
HAVING Sum(KOSZT)<(选择 MAX(SU M(KOSZT))
                      FROM WYPOZYCZENIA
                    WHERE EXTRACT(YEAR FROM DATA_WYP)= 2006
                        EXTRACT(一个月DATA_WYP)IN( '2', '3')
                    GROUP BY EXTRACT(一个月DATA_WYP))

我希望这可以解决您的问题。