SQL:MAX值的SUM WHERE date1< = date2返回“错误”结果

时间:2014-07-21 13:47:56

标签: sql sum max where hsqldb

您好stackoverflow用户

我在尝试将SUM,MAX和WHERE组合在一个查询中并且经过激烈的Google搜索(我的搜索引擎技能通常不会让我失败)之后遇到了一些问题,你是我最后的希望了解并解决以下问题。

我的目标是在一段时间内计算人数,因为一个人在上述期间可以多次访问,我使用MAX。由于我使用字符串将人定义为男性(m)或女性(f)(出于统计目的),因此CHAR_LENGTH返回需要的数字。

SELECT SUM(max_pers) AS "People"
FROM (
   SELECT "guests"."id", MAX(CHAR_LENGTH("guests"."gender")) AS "max_pers"
   FROM "guests"
   GROUP BY "guests"."id")

到目前为止,这么好。但是现在,如前所述,我只想计算在特定时间间隔内访问过的客人(出于统计目的)。

SELECT "statistic"."id", SUM(max_pers) AS "People"
FROM (
   SELECT "guests"."id", MAX(CHAR_LENGTH("guests"."gender")) AS "max_pers"
   FROM "guests"
   GROUP BY "guests"."id"),
"statistic", "guests"
WHERE ( "guests"."arrival" <= "statistic"."from" AND "guests"."departure" >= "statistic"."to")
GROUP BY "statistic"."id"

此查询返回以下内容,x =所需结果:

x * (x+1)

因此,如果结果应该是3,那么它是12.如果它应该是5,那么它等等。

我可能可以解决这个代数问题,但我宁愿理解我做错了什么并从中学习。

提前致谢,我当然会回答所有进一步的问题。

PS:我使用的是LibreOffice Base。

编辑:一个例子

嘉宾表:

ID | arrival | departure | gender |
10 | 1.1.14  |  10.1.14  |   mf   |
10 | 15.1.14 |  17.1.14  |   m    |
11 | 5.1.14  |   6.1.14  |   m    |
12 | 10.2.14 |  24.2.14  |   f    |
13 | 27.2.14 |  28.2.14  | mmmmmf |

统计表:

ID |  from  |   to    |  name  |
1  | 1.1.14 | 31.1.14 |January |  expected result: 3
2  | 1.2.14 | 28.2.14 |February|  expected result: 7

3 个答案:

答案 0 :(得分:0)

你有一个非常奇怪的数据结构。无论如何,我想你想要:

SELECT s.id, sum(numpersons) AS People
FROM (select g.id, max(char_length(g.gender)) as numpersons
      from guests g join
           statistic s
     on g.arrival <= s."from" AND g.departure >= s."too"
      group by g.id
     ) g join
GROUP BY s.id;

答案 1 :(得分:0)

MAX(...)功能错误:您需要COUNT(DISTINCT ...)

添加正确的连接语法,简化(并删除不必要的引号),这应该有效:

SELECT s.id, COUNT(DISTINCT g.id) AS People
FROM statistic s 
LEFT JOIN guests g ON g.arrival <= s."from" AND g.departure >= s."too" 
GROUP BY s.id

注意:使用LEFT加入意味着对于没有来宾的统计信息ID,您将得到零结果。如果您不想删除任何行,请删除LEFT关键字。

答案 2 :(得分:0)

感谢您的所有投入。我不熟悉JOIN,但有必要解决我的问题。 由于我的数据库是用德语设计的,所以在翻译时我犯了很大的错误,如果这引起了混乱,我很抱歉。 选择guests.id以及稍后由guests.id分组将没有任何意义,因为id是唯一的。我真正想要做的是选择并分组来自访客数据库的来宾guestadd_id。

我的问题的正确解决方案是以下代码:

SELECT statname, SUM (numpers) FROM (
    SELECT statistic.name AS statname, guests.adr_id, MAX( CHAR_LENGTH( guests.gender ) ) AS numpers
    FROM guests
    JOIN statistics ON (guests.arrival <= statistics.too AND guests.departure >= statistics.from )
    GROUP BY guests.adr_id, statistic.name )
GROUP BY statname

我还注意到我的数据库结构很乱,但是我创建它实现了学习,并且还没有找到任何时间来重写它。下次发帖,我会更好。