代码之家  ›  专栏  ›  技术社区  ›  DEwok

SQL分组依据和具有显示字段

  •  0
  • DEwok  · 技术社区  · 11 年前

    我试图提取与405B文件夹相关的人员记录,其中有超过1个文件夹的人员记录。我使用了下面的SQL来获取计数,但我无法理解的是如何提取实际的人员信息,p.namefirst、p.nameast、p.organizationname和fp.peoplecode。我只需要来自文件夹、文件夹人员和超过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 回复  |  直到 11 年前
        1
  •  1
  •   pmbAustin    11 年前

    没有真正理解你的模式或数据(这里的例子会很有用),听起来你想要这样的东西?

    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与从未分组的表和列中获取所有数据相结合。

        2
  •  0
  •   Gordon Linoff    11 年前

    大概,您有某种“人物”表,其中包含您在问题中引用的列。这可以连接回 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;