1
CREATE TABLE `table`
    (`source` varchar(20), `eventid` varchar(9), `system` varchar(10),`accountname` varchar(10)) 
;

INSERT INTO `table`
    (`source`, `eventid`, `system` ,`accountname`)
VALUES
    ('uatapp', '528', 'bxw','jbb'),
    ('uatapp', '528', 'bxw','jbc'),
    ('nxapp', '530', 'gg','ff'),
    ('aaunswh20', '528', 'ccd','ff'),
    ('172.1.12.3', '528','vv','ff'),   
        ('172.1.12.3', '528', 'vv', 'ff'),
    ('172.1.12.3', '528','vv','ff3')
;

如果我使用查询

SELECT   SOURCE,accountname,SYSTEM, count(*)
FROM     `table`
WHERE    eventid = '528'
GROUP BY SOURCE,accountname

我得到结果

SOURCE  ACCOUNTNAME     SYSTEM  COUNT(*)
172.1.12.3  ff  vv  2
172.1.12.3  ff3     vv  1
aaunswh20   ff  ccd     1
uatapp  jbb     bxw     1
uatapp  jbc     bxw     1

我希望结果只显示

SOURCE  ACCOUNTNAME     SYSTEM  COUNT(*)
172.1.12.3  ff  vv  2
172.1.12.3  ff3     vv  1
uatapp  jbb     bxw     1
uatapp  jbc     bxw     1

(ie) 将源、帐户名分组为多行,而不是单行,例如 AAUNSWH20。

有人可以帮助制定查询吗?..谢谢

4

2 回答 2

1

您可能拒绝的基本查询是正确显示源和系统的查询,但未按以下方式分组accountname

SELECT source, system
FROM `table`
WHERE eventid = '528'
GROUP BY source, system
HAVING Count(DISTINCT accountname) >= 2;

这样做的问题是,您看不到使用了哪些帐户名。这可以通过将此查询放入派生表中来完成,并连接回原始表,如下所示:

SELECT DISTINCT
   T.*
FROM
   `table` T
   INNER JOIN (
      SELECT source, system
      FROM `table`
      WHERE eventid = '528'
      GROUP BY source, system
      HAVING Count(DISTINCT accountname) >= 2
   ) D ON T.source = D.source
      AND T.system = D.system
WHERE
   T.eventid = '528'
;

看到这个在 Sql Fiddle 中工作。

于 2013-04-05T23:59:45.150 回答
0

也许你可以使用这个:

SELECT   SOURCE,accountname,SYSTEM, count(*)
FROM     [table] a
WHERE    eventid = '528'
and exists (select source, COUNT(*) from [table] b
            where a.eventid = b.eventid
            and a.source = b.source
            group by source
            having COUNT(*) > 1)
GROUP BY SOURCE,system,accountname

无论如何,table是保留关键字,因此[]请在您的查询中使用。

于 2013-04-05T23:34:36.133 回答