【问题标题】:Comparing columns within a group in sql比较sql中组内的列
【发布时间】:2011-10-18 06:37:06
【问题描述】:

我对 SQL 很陌生,所以如果这个问题难以理解,我深表歉意。

假设我有一张这样的桌子:

姓名 生日 鲍勃 7/18 鲍勃 7/18 马克 5/10 马克 7/5 苏 2/1 乔 1/14 乔 1/14 乔 1/2 杰夫 9/16 杰夫 3/20 杰夫 6/13 [...]

我想执行一个选择语句,为我提供有多个不同生日的人的姓名。

因此,对于我的示例表,输出将是 Mark、Joe 和 Jeff。

感谢您的帮助。

【问题讨论】:

  • 运行select @@Version,但说SQL Server 2008就足够了
  • 我强烈建议您使用我的测试数据测试 Dem 的解决方案。你得到的是 Jake 和 Mark 而不是 Pete 和 Mark

标签: sql sql-server tsql sql-server-2008 group-by


【解决方案1】:

试试这个:

select
    NAME
    FROM (select
              NAME
              FROM YourTable
              GROUP BY Name,Birthday
              HAVING Count(Name)=1
         ) dt
    GROUP BY Name
    HAVING COUNT(Name)>1

SQL Server 的工作示例代码:

DECLARE @YourTable table (name varchar(10),Birthday varchar(10), FavoriteColor varchar(10))
INSERT @YourTable VALUES ('Bob'  ,   '7/18'   ,    'Blue')
INSERT @YourTable VALUES ('Bob'  ,   '7/18'   ,    'Green')
INSERT @YourTable VALUES ('Mark' ,   '5/10'   ,    'Blue')
INSERT @YourTable VALUES ('Mark' ,   '7/5'    ,    'Green')

select
    NAME
    FROM (select
              NAME
              FROM @YourTable
              GROUP BY Name,Birthday
              HAVING Count(Name)=1
         ) dt
    GROUP BY Name
    HAVING COUNT(Name)>1

输出:

NAME
----------
Mark

【讨论】:

  • 这是一个难以理解的问题,对于许多可能的异常以及如何处理它们存在很多歧义。
  • 我为歧义道歉。我只是想看看有不同生日与不同颜色相关联的人。你想让我澄清什么?谢谢你的帮助:-)
  • 如果添加记录'Bob', '5/10', 'Red'; Bob 现在应该包含在结果中,但不会。
  • 0 行与我的测试数据一起返回
  • @Dems,如果添加'Bob', '5/10', 'Red',是否应该显示?如果你添加一个'Jim', '5/12', 'purple' 应该也显示吗?如果你再添加一个'Bob', '5/10', 'yellow',Bob 还会显示吗?更改代码以解决所有这些问题很容易,但规范对它应该如何工作的细节含糊不清。
【解决方案2】:
SELECT name FROM table_xyz 
GROUP BY Name, Birthday
HAVING count(*) = 1

【讨论】:

  • 如果马克只有一个生日(隐含地只有一种颜色),您的查询仍然会返回马克。
  • 马克可以有相同的生日和两种不同的颜色。我希望拥有与不同颜色相关联的不同生日的人。
【解决方案3】:

您可以通过几种不同的方式来做到这一点。您可以JOIN 表本身,也可以使用EXISTS 子句。

SELECT DISTINCT
    T1.name
FROM
    Some_Table AS T1
WHERE
    EXISTS (SELECT *
            FROM Some_Table T2
            WHERE T2.name = T1.name AND
                  T2.birthday <> T1.birthday)

SELECT DISTINCT
    T1.name
FROM
    Some_Table AS T1
INNER JOIN Some_Table AS T2 ON
    T2.name = T1.name AND
    T2.birthday <> T1.birthday

您也可以使用HAVINGclause 解决这个特殊问题:

SELECT
    T1.name
FROM
    Some_Table AS T1
GROUP BY
    T1.name
HAVING
    MAX(birthday) <> MIN(birthday)

【讨论】:

  • 我测试了最后一个 sql,它没有工作尝试 - insert some_table values('Mark','7/5','yellow')
【解决方案4】:

我理解你的问题陈述的重新措辞:

所有名称,其中:
- 该名称有多个与之关联的颜色
- 其中,至少有两种颜色有不同的生日相关联

我不确定的是,同一个颜色是否可以有两个不同的生日与同一个名字相关联?


如果no,颜色变得无关紧要,您只需要一个与多个不同生日相关联的名称。

SELECT
  Name
FROM
  yourTable
GROUP BY
  name
HAVING
  COUNT(DISTINCT birthday) > 1


如果 `yes`,您需要找到另一个名称相同但颜色不同且生日不同的记录。 选择 姓名 从 你的表 在哪里 EXISTS (SELECT * FROM yourTable as [lookup] WHERE Name = yourTable.Name AND Birthday yourTable.Birthday AND Color yourTable.Colour) 通过...分组 姓名

【讨论】:

  • 我在尝试此操作时收到以下错误消息... 列“生日”在选择列表中无效,因为它既不包含在聚合函数或 GROUP BY 子句中。跨度>
  • 您是按原样执行查询,还是更改它并添加生日字段?
  • 我正在用列名替换表中的实际列名。我不确定添加生日字段是什么意思...
  • 而你的答案中的问题的答案是否定的,不可能有两个不同的生日为同一个颜色关联到同一个名字。
  • 在我的示例查询中,我 SELECT xGROUP BY x。如果您将x 更改为一个,则必须同时更改另一个x;你不能SELECT你不能GROUP BY
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-30
相关资源
最近更新 更多