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