【问题标题】:Informix SQL count() comparisonsInformix SQL count() 比较
【发布时间】:2010-10-16 00:17:23
【问题描述】:

我正在尝试构建一个 SQL 查询,该查询将计算每个 id 的总行数以及按 id 分组的“FN%”和“W%”等级的数量。如果这些数字相等,则学生只有全部 'FN%' 或全部 'W%' 或两者的组合。

我需要一个只有 'FN%' 或 'W%' 统计数据的所有 id 的列表

示例 id # 683 & 657 会进入查询的结果集,但 603、781 和 694 不会

   id stat
  683 WF
  683 WF
  683 WF
  683 WF
  683 W
  683 W
  657 W
  657 W
  657 W
  657 W
  781 B+
  781 IP
  781 WP
  781 WP
  603 FN
  603 FN
  603 F
  603 FN
  603 FN
  694 B
  694 B+
  694 CI
  694 LAB
  694 WF
  694 WF

样本输出:

683
657

【问题讨论】:

    标签: sql count grouping informix


    【解决方案1】:

    这是针对原始问题编写的:

    select first 50
    c.id,
    (select trim(fullname) from entity where id = c.id) fullname,
    count(*),
    (select count(*) from courses where id = c.id and grd like 'FN%') FN,
    (select count(*) from courses where id = c.id and grd like 'W%') W
    from courses c
    group by 1
    

    出于某种原因,检索名称的子查询比使用连接要快得多。

    编辑: 以下将与 yukondude 的答案具有相同的行为,但在我们的 HPUX / Informix v10.00.HC5 机器上表现更好。

    select c.id
    from courses c
    where not exists (
            select id
            from courses
            where (grd not like 'W%' and grd not like 'FN%')
            and id = c.id
    )
    group by 1
    

    【讨论】:

    • 这会产生比需要更多的行,并包含不需要的数据,并引用未定义的表...
    • 看来您正在运行 Jenzabar CX - 但我可能是错的。如果是,请将“entity”替换为 id_rec,将“courses”替换为 cw_rec。
    • 不,你是对的......那是令人毛骨悚然的马特。出于显而易见的原因,我不想使用真实身份和全名。
    • 你的连续问题是一个死的赠品。如果您有任何 CX 特定问题,电子邮件会在我的个人资料中。
    • 哦,我的其他问题......这很有道理,谢谢......我一定会把它放在我的通讯录中
    【解决方案2】:

    其中 xxxx 是保存待处理信息的临时表.....

    select id, fullname, count(id) ttl 
    from xxxx 
    group by id, fullname 
    into temp www with no log;
    
    
    select id, fullname, count(id) ttl_f 
    from xxxx 
    where grd like 'FN%' or grd like 'W%' 
    group by id, fullname 
    into temp wwww with no log;
    
    
    select www.id, www.fullname 
    from www, wwww 
    where www.id = wwww.id and www.ttl = wwww.ttl_f;
    

    【讨论】:

    • 这是一个很长的路要走。全名从何而来?
    【解决方案3】:

    这是我能想到的两种可能的解决方案。我不确定它们是否可以在 Informix 中工作:

    SELECT  id
    FROM    foo a
    GROUP   BY id
    HAVING  COUNT(*) = (
                    SELECT  COUNT(*)
                    FROM    foo b
                    WHERE   a.id = b.id
                    AND     (b.stat LIKE 'FN%' OR b.stat LIKE 'W%')
            );
    

    如果 HAVING 子句中的子查询是禁止的,也许这会起作用:

    SELECT  id
    FROM    (
                    SELECT  id, COUNT(*) stat_count
                    FROM    foo
                    WHERE   (stat LIKE 'FN%' OR stat LIKE 'W%')
                    GROUP   BY id
            ) a
    WHERE   stat_count = (SELECT COUNT(*) FROM foo b WHERE a.id = b.id);
    

    更新:我刚刚在 Oracle 中尝试了这些,并且都可以工作。

    【讨论】:

    • 这两个查询在 Solaris 10 上的 Informix IDS 11.50.FC3W2 中都能正常工作。
    【解决方案4】:

    这种解释让我头疼。你在寻找这两组的结合吗?

    • 只有统计数据匹配“W%”的 ID
    • 仅具有匹配“FN%”的统计信息的 ID

    如果是这种情况,请将其设为 UNION 查询,并为每个集合创建一个子查询。

    【讨论】:

    • 我什至不喜欢我自己的解释...我只需要找到所有只有 ('FN%' 或 'W%') 统计数据的 id's
    猜你喜欢
    • 2021-12-03
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多