【问题标题】:SQL Group By and Having display fieldsSQL 分组依据和具有显示字段
【发布时间】:2015-02-24 19:57:44
【问题描述】:

我正在尝试提取与 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

有什么建议吗?

【问题讨论】:

  • 我可以很好地添加这些字段,但它会从 500 条记录减少到更少,我需要所有 500 条我想要的字段。
  • 你能从你的数据中添加一点,告诉我们你希望得到什么

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


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

【讨论】:

  • 这让我有所收获,我正在尝试并根据数据进行调整。但是,是的,您的假设是正确的。
【解决方案2】:

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

【讨论】:

  • 有趣。我很惊讶它花了更长的时间。
猜你喜欢
  • 2020-06-09
  • 1970-01-01
  • 2019-01-14
  • 1970-01-01
  • 2012-04-16
  • 2017-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多