SQL复杂的查询

时间:2013-05-18 14:36:21

标签: sql select

我的SQL查询存在以下问题。我成功地执行了大约15个,但是这个让我生病了。它甚至很难翻译,但你可能会理解。

显示每月总成本低于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保存它们,但它也不起作用。

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

提前致谢。

4 个答案:

答案 0 :(得分:3)

要按SQL查询中的聚合函数的结果进行筛选,请将比较放在HAVING语句中。

答案 1 :(得分: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

答案 2 :(得分: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)

答案 3 :(得分:0)

试试这个 - :

SELECT EXTRACT(年数来自DATA_WYP)
 摘录(DATA_WYP中的月份),
 SUM(KOSZT)
FROM WYPOZYZZENIA
GROUP BY 提取物(年数来自DATA_WYP)
摘录(DATA_WYP中的月份)
HAVING 总和(KOSZT)&lt;( SELECT MAX(SUM(KOSZT))
  FROM WYPOZYZZENIA
  WHERE EXTRACT(年数来自DATA_WYP)= 2006年
提取(DATA_WYP中的月份)IN('2','3')
  GROUP BY EXTRACT(DATA_WYP个月))

我希望这能解决你的问题。