INNER JOIN的SQL查询,GROUP / COUNT问题

时间:2015-08-17 19:39:59

标签: sql ms-access-2010

我有一个主要由日期,ID和地址组成的数据集,看起来有点像这样:

datadate   id      address
20150801    Bob     123
20150801    Bob     123
20150801    Dan     345
20150801    Dan     456
20150801    Dan     567
20150801    George  234
20150801    Jim     123
20150801    Jim     123
20150801    John    678
20150801    John    123
20150802    Tom     123
20150802    Tom     234
20150802    Tom     345

我的目标是编写一个查询,用于标识与特定日期(或日期范围)的多个不同地址关联的任何ID。我希望查询结果为我提供名称和不同的地址。因此,对于这个数据集,我希望看到的结果看起来像这样,对于2015年8月1日:

datadate   id      address
20150801    Dan     345
20150801    Dan     456
20150801    Dan     567
20150801    John    678
20150801    John    123

我到目前为止所做的查询是这样的,但它并不适合我:

SELECT a.[datadate], a.[id], a.[address], b.[count1]
FROM table1 AS a INNER JOIN (SELECT [id], COUNT([address]) as [count1]   FROM table1   GROUP BY [id]   having count1 > 1   )  AS b ON a.[id]=b.[id]
WHERE a.[datadate] = '20150801'
ORDER BY a.[id], a.[address];

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

只需稍微修改您现有的查询,您就可以更改您的count(distinct address),然后加入表格以获取您的地址值:

SELECT t.datadate
      ,t.id
      ,t1.address
FROM (
    SELECT datadate
        ,id
        ,count(DISTINCT address) address
    FROM test
    WHERE datadate = '20150801'
    GROUP BY datadate,id
    HAVING count(DISTINCT address) > 1
    ) t
INNER JOIN test t1 ON t.datadate = t1.datadate
    AND t.id = t1.id;

我在SQL Server上对此进行了测试,但在MS-Access中也应该类似。

SQL Fiddle Demo

答案 1 :(得分:0)

修改

我刚刚再次阅读了您的问题,看起来您想要所有重复项。在这种情况下,我会使用exists来查看是否存在具有相同ID但具有不同地址的另一行。

select * from mytable t1
where datadate = '20150801'
and exists (
    select 1 from mytable t2
    where t2.id = t1.id
    and t2.address <> t1.address
    and t2.datadate = t1.datadate
)