【问题标题】:SQL - SELECT DISTINCT on one columnSQL - 在一列上选择 DISTINCT
【发布时间】:2018-11-01 21:25:27
【问题描述】:

我有一张这样的桌子

  ID  NAME     TL_NUM    TL_NAME      MANAGER_NUM
  ===============================================
  1   F-23      2         T-2         1
  2   B-23      3         T-3         2
  3   F-24      2         T-2         1
  4   F-25      1         T-1         2
  5   F-26      2         T-2         2 
  6   F-27      1         T-1         2

现在我想得到如下结果集

  TL_NUM    TL_NAME    MANAGER_NUM
  ================================
  2         T-2         1
  3         T-3         2
  1         T-1         2
  2         T-2         2 

我尝试使用以下查询

   select DISTINCT TL_NUM, TL_NAME,MANAGER_NUM
   from dataTable

当使用这个查询而不是上面那个时,它给了我一个正确的结果集:

  select DISTINCT TL_NUM, TL_NAME
   from dataTable

但它没有在我的结果集中返回正确的“MANAGER_NUM”。谁能让我知道确切的问题是什么,我相信这是因为 DISTINCT?

【问题讨论】:

  • 应该的。但是该查询应该出错,因为您选择了一个名为 TL 的列,并且您没有具有该名称的列。你想要的是select DISTINCT TL_NUM, TL_NAME, MANAGER_NUM FROM datTable
  • 您需要对您想要总计的列求和。
  • 对不起,我的错,我已经更正了选择中的列名
  • 那么你得到了什么价值?
  • 您期望什么值?

标签: sql sql-server tsql distinct


【解决方案1】:

您的查询看起来不错并且工作正常,但根据输出排序不正确。我已经测试了查询并且工作正常。

select DISTINCT TL_NUM, TL_NAME ,MANAGER_NUM from #dataTable order by MANAGER_NUM

【讨论】:

    【解决方案2】:

    你可以这样做:

    CREATE TABLE TAB1 ( ID INT,NAME NVARCHAR(100),TL_NUM INT,TL_NAME 
    NVARCHAR(100),MANAGER_NUM INT)
    
    INSERT INTO TAB1
    VALUES
    (1, 'F-23', 2, 'T-2', 1)
    ,(2, 'B-23', 3, 'T-3', 2)
    ,(3, 'F-24', 2, 'T-2', 1)
    ,(4, 'F-25', 1, 'T-1', 2)
    ,(5, 'F-26', 2, 'T-2', 2)
    ,(6, 'F-27', 1, 'T-1', 2)
    
    SELECT   DISTINCT t.TL_NUM ,t.TL_NAME ,t.MANAGER_NUM 
    FROM     TAB1 AS t;
    

    【讨论】:

    • 虽然此代码可能会或可能不会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
    【解决方案3】:

    经过测试,它确实返回了正确的值 - 您是否正确查看了这些值?这是一个用于创建表的工作版本的测试脚本:

    CREATE TABLE #dataTable (id int identity, Name varchar(10), TL_NUM smallint, TL_NAME varchar(10), MANAGER_NUM smallint)
    INSERT INTO #datatable (Name, TL_NUM, TL_NAME, MANAGER_NUM)
    VALUES 
         ('F-23',      2,         'T-2',         1),
         ('B-23',      3,         'T-3',         2),
         ('F-24',      2,         'T-2',         1),
         ('F-25',      1,         'T-1',         2),
         ('F-26',      2,         'T-2',         2),
         ('F-27',      1,         'T-1',         2)
    

    然后我使用了您的查询:

    select DISTINCT TL_NUM, TL_NAME ,MANAGER_NUM
    from #dataTable
    

    并且得到了这个返回值集:

    ---------------------------------
    |TL_NUM |TL_NAME    |MANAGER_NUM|
    ---------------------------------
    |1      |T-1        |2          |
    |2      |T-2        |1          |
    |2      |T-2        |2          |
    |3      |T-3        |2          |
    ---------------------------------
    

    主要区别在于返回行的顺序,但它们返回的是正确的值。

    【讨论】:

      【解决方案4】:

      在下面查看我的小提琴:

      DECLARE @tmp TABLE ( ID INT,NAME NVARCHAR(100),TL_NUM INT,TL_NAME NVARCHAR(100),MANAGER_NUM INT)
      
      INSERT INTO @tmp
      VALUES
      (1, 'F-23', 2, 'T-2', 1)
      ,(2, 'B-23', 3, 'T-3', 2)
      ,(3, 'F-24', 2, 'T-2', 1)
      ,(4, 'F-25', 1, 'T-1', 2)
      ,(5, 'F-26', 2, 'T-2', 2)
      ,(6, 'F-27', 1, 'T-1', 2)
      
      SELECT   DISTINCT t.TL_NUM ,t.TL_NAME ,t.MANAGER_NUM 
      FROM     @tmp AS t
      ORDER BY t.MANAGER_NUM
              ,t.TL_NAME DESC
      

      【讨论】:

        猜你喜欢
        • 2010-11-01
        • 2020-03-16
        • 1970-01-01
        • 2010-12-19
        • 1970-01-01
        • 2021-02-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多