SQL:date1

SQL:date1,sql,sum,max,where,hsqldb,Sql,Sum,Max,Where,Hsqldb,Hi stackoverflow用户 我在一个查询中尝试合并SUM、MAX和WHERE时遇到了一点问题,在一次激烈的谷歌搜索之后,我的搜索引擎技能通常不会让我失望,你是我理解和解决以下问题的最后希望 我的目标是统计某一段时间内的人数,因为一个人在这段时间内可以访问多次,所以我使用MAX。由于我使用字符串将人定义为男性m或女性f用于统计目的,CHAR_LENGTH返回我需要的数字 SELECT SUM(max_pers) AS "People" FROM ( SELECT "guests".

Hi stackoverflow用户

我在一个查询中尝试合并SUM、MAX和WHERE时遇到了一点问题,在一次激烈的谷歌搜索之后,我的搜索引擎技能通常不会让我失望,你是我理解和解决以下问题的最后希望

我的目标是统计某一段时间内的人数,因为一个人在这段时间内可以访问多次,所以我使用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"
如果结果应该是3,那么它是12。如果应该是5,那么是30等等

我可能可以解决这个代数问题,但我更愿意理解我做错了什么,并从中吸取教训

提前谢谢,我肯定会回答所有进一步的问题

附言:我用的是libreofficebase

编辑:一个例子

宾客餐桌:

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

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

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;
马克斯。。。是错误的函数:您想要

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

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 join意味着对于没有来宾的统计ID,结果为零。如果您不希望任何行,请删除LEFT关键字。

谢谢您的所有输入。我不熟悉JOIN,但它是解决我的问题所必需的。 由于我的数据库是用德语设计的,我在翻译时犯了一个很大的错误,如果这造成了混乱,我很抱歉。 选择guests.id以及稍后按guests.id分组都没有任何意义,因为id是唯一的。我实际上想做的是选择和分组guests.adr_id,它将来访的客人链接到adress数据库

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

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

我还注意到我的数据库结构一团糟,但我是边做边学创建的,还没有找到时间重写它。下次发帖时,我会尽力做得更好。

您能从表格中显示一些示例数据和预期结果吗?看起来您可能正在三个来源之间创建笛卡尔连接,这肯定会扭曲数字。因此,您想要统计表中在特定日期之间访问的不同人数?我不明白您为什么使用MAXCHAR_LENGTHguests.gender。您是说gender列包含m或f,因此CHAR_LENGTHguests.gender将始终返回1-因此,MAXCHAR_LENGTHguests.gender也将始终返回1。在你的查询中使用它有什么意义?@Bohemian我创建了一个显示查询的表单。统计表的唯一目的是定义不同的区间并命名它们。@Siyual我编辑了主要帖子。谢谢你的回答。在我的第一篇文章中添加的评论应该会给你带来一些许可。a性别列可以包含多个字符b statistic是一个表,其唯一目的是定义间隔并命名间隔
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