2015-02-24 61 views
0

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

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 

有什么建议吗?

+0

我可以添加这些领域很好,但它会从500条记录到少于这个数字,我需要全部500个字段。 – DEwok 2015-02-24 20:00:03

+0

你可以添加一些数据,并告诉我们你期望得到什么 – Smog 2015-02-24 20:01:38

回答

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与从未组合的表和列中获取的所有数据组合在一起的格式。

+0

这是让我在某个地方,我正在尝试和调整由于数据。但是,是的,你认为是正确的。 – DEwok 2015-02-24 20:25:18

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; 
+0

这也适用,但运行时间较长。 – DEwok 2015-02-24 20:50:10

+0

有趣。我很惊讶花了更长的时间。 – 2015-02-24 22:22:44