【问题标题】:Can't order by name when use Group By使用 Group By 时无法按名称排序
【发布时间】:2019-11-14 10:31:49
【问题描述】:

我正在使用以下 SQL 查询将数据插入临时表

INSERT INTO @tmp_Notify 
    SELECT     'U' + CONVERT(varchar,UserId), CONVERT([varchar](50), [FirstName]) + ' ' + CONVERT([varchar](50), [LastName])
    FROM  [User] 
            INNER JOIN dbo.UserGroup ON UserId = FkUserId  
            INNER JOIN [Group] ON GroupId = FkGroupId 
    GROUP BY UserId, CONVERT([varchar](50), [FirstName]), CONVERT([varchar](50), [LastName])
    HAVING MIN(GroupLevel) >= @minGroup
    ORDER BY CONVERT([varchar](50), [FirstName]), CONVERT([varchar](50), [LastName])

我插入几个数据如下,

将组数据插入为

INSERT INTO @tmp_Notify 
    SELECT     'G' + CONVERT(varchar,GroupId), 'Group - ' + GroupName
    FROM  [Group] 
    WHERE GroupLevel >= @minGroup AND IsActive = 1
    ORDER BY GroupName

所以我需要先显示用户名列表,然后按 GroupName 显示组名。

我的完整代码是

    --Users of the same group as currently logged in user and userÆs of higher groups
    INSERT INTO @tmp_Notify 
        SELECT     'U' + CONVERT(varchar,UserId), CONVERT([varchar](50), DECRYPTBYKEY([FirstName])) + ' ' + CONVERT([varchar](50), DECRYPTBYKEY([LastName]))
        FROM  [User] 
                INNER JOIN dbo.UserGroup ON UserId = FkUserId  
                INNER JOIN [Group] ON GroupId = FkGroupId 
        GROUP BY UserId, CONVERT([varchar](50), DECRYPTBYKEY([FirstName])), CONVERT([varchar](50), DECRYPTBYKEY([LastName]))
        HAVING MIN(GroupLevel) >= @minGroup
        ORDER BY CONVERT([varchar](50), DECRYPTBYKEY([FirstName])), CONVERT([varchar](50), DECRYPTBYKEY([LastName]))

    select * from @tmp_Notify

    --Currently logged in userÆs group and higher groups
    INSERT INTO @tmp_Notify 
        SELECT     'G' + CONVERT(varchar,GroupId), 'Group - ' + GroupName
        FROM  [Group] 
        WHERE GroupLevel >= @minGroup AND IsActive = 1
--      GROUP BY GroupId, GroupName
--      HAVING MIN(GroupLevel) >= @minGroup
        ORDER BY GroupName
END
ELSE
BEGIN
    INSERT INTO @tmp_Notify VALUES('Me','Me')

    IF((SELECT FkSupervisor FROM [User] WHERE UserId = @currentUser) IS NOT NULL)
    BEGIN
        INSERT INTO @tmp_Notify VALUES('Supervisor','Supervisor')
    END
END

    --List Option (to allow a list of email addresses)
    INSERT INTO @tmp_Notify VALUES('List','List')   

    --SELECT * FROM @tmp_Notify tn order by tn.NotifyName
    SELECT * FROM @tmp_Notify

但这不是正确的顺序,我需要按FirstNameLastName 对数据进行排序。我该怎么做呢

我的预期输出是

U10059  Emily Windrow
U10039  Esta Kulzer
U10030  Ileana Conklin
U10040  Kamala Millerbernd
U10007  Katherine Tayan
G110    Group - Managers
G112    Group - Membership Officers
G113    Group - Mortgage
G108    Group - Operations Administrator
G109    Group - PFS
List    List

【问题讨论】:

  • 您为什么要订购您的插件?
  • 因为上面插入了多个数据,所以我需要按订单名称获取最终结果
  • 如果您需要您的 final 结果按特定顺序排列,则 ORDER BY 进入 SELECT 语句,而不是 INSERT
  • 但是对插入进行排序根本没有任何效果(除了减慢查询速度)。对数据进行排序的唯一方法是在查询表时使用order by
  • @Larnu 问题是我在那个表中插入了几个数据,比如先是用户名列表,然后是组,

标签: sql sql-server group-by sql-order-by


【解决方案1】:

这是一个常见的误解。

向插入语句添加顺序没有任何意义,因为原始数据表没有内在的保证顺序。在 SQL Server 中,无论数据进入的顺序如何,它都将存储在聚集索引中,因此按此排序。它也将被添加到表中可能再次不同的任何其他索引中。如果您根本没有索引并且您的表是一个堆,那么无论您做什么,订单都无法确定。

当您查询一个表时,没有默认的保证顺序,除非您使用 ORDER BY 指定它,否则数据将返回。如果没有这个,返回的数据理论上可以是任何顺序(SQL Server 将按任何顺序输出,使其能够在最快的时间内完成查询)。

您将数据放入表中的顺序与您将其再次取出的顺序无关。

【讨论】:

    【解决方案2】:

    你可以使用类似的东西得到你想要的:

    DECLARE @tmp_Notify TABLE (id INT IDENTITY(1, 1), FirstName VARCHAR(50), lastname VARCHAR(50))
    
    INSERT @tmp_Notify (FirstName, lastname)
    VALUES ( 'Bob', 'Curtis')
    ,       ('Mary', 'Magdalene')
    
    INSERT @tmp_Notify (FirstName, lastname)
    VALUES ( 'GROUP', '1')
    ,       ('GROUP', '2')
    
    INSERT @tmp_Notify (FirstName, lastname)
    VALUES ( 'List', 'List')
    
    SELECT  TN.id
    ,       TN.FirstName
    ,       TN.lastname
    FROM    @tmp_Notify AS TN
    ORDER BY TN.id
    

    在这种情况下,您可以在INSERT 中使用ORDER BY,因为这将确定id 的值。

    【讨论】:

    • 谢谢先生救了我的命
    • 假设如果我添加附加列作为 IdentityColm 并插入 A,B,C 作为每个用户组数据插入。那么我可以通过分组按名称对其进行排序吗?
    • 假设如果我添加附加列作为 IdentityColm 并插入 A,B,C 作为每个用户组数据插入。那么我可以通过分组按名称对其进行排序吗?
    • 我不明白你的意思,也许值得问一个新问题
    • 那么当有人结婚并改姓时会发生什么?在这种情况下,他们的名字相对于标识列是乱序的。另外-如果需要添加新的人怎么办?当我们插入时,标识值会增加,但这与某人的姓名或是否按顺序无关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 2011-09-13
    • 1970-01-01
    • 2019-01-18
    • 2017-06-25
    • 1970-01-01
    相关资源
    最近更新 更多