SQL Group By和Having显示字段

时间:2015-02-24 19:57:44

标签: sql sql-server group-by having having-clause

我正在尝试拉出与405B文件夹相关联的人员记录,其中有超过1个文件夹记录。我已经使用以下SQL来获取计数,但我无法弄清楚如何提取实际的人员信息,p.namefirst,p.namelast,p.organizationname和fp.peoplecode。我已尝试在GROUP BY和HAVING上使用各种排列,但我一直在收到错误。我只想要来自文件夹,文件夹人和有超过1个文件夹记录的人的数据。

SELECT f.folderrsn, Count(fp.folderrsn)
FROM folder f
INNER JOIN folderpeople fp ON f.folderrsn = fp.folderrsn
WHERE f.foldertype = '405B'
GROUP BY f.folderrsn
HAVING Count(fp.folderrsn) > 1
ORDER BY f.folderrsn

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

不是真正了解你的架构或数据(这里的例子确实会有所帮助),它的声音就像你想要这样的东西?

SELECT p.namefirst, p.namelast, p.organizationname, fp.peoplecode
  FROM folder f
       INNER JOIN folderpeople fp ON f.folderrsn = fp.folderrsn
WHERE fp.folderrsn IN (
    SELECT folderrsn
      FROM folder 
     WHERE folderType = '405B'
     GROUP BY folderrsn
    HAVING COUNT(folderrsn) > 1
)

基本上,从所需的表中选择所需的所有数据,然后将结果过滤到仅符合条件的文件夹。所以我在这里可能有错误的详细信息,但是这可能会为您提供一种格式,您可以在如何将GROUP BY / HAVING与从您未分组的表和列中获取所有数据相结合。

答案 1 :(得分:0)

据推测,您有某种“人”表,其中包含您在问题中引用的列。这可以加入folderpeople

鉴于此,您可以通过重新加入信息来解决问题。这是一个消息,因为您也可以使用SQL Server中的窗口函数来执行此操作:

SELECT pf.*
FROM (SELECT p.*, f.folderrsn,
             count(*) over (partition by f.folderrsn) as cnt
      FROM folder f INNER JOIN
           folderpeople fp
           ON f.folderrsn = fp.folderrsn JOIN
           people p
           ON fp.personid = p.personid
      WHERE f.foldertype = '405B'
     ) pf
WHERE cnt > 1
ORDER BY olderrsn;