【问题标题】:SQL Select Counter by GroupSQL 按组选择计数器
【发布时间】:2010-10-30 11:54:10
【问题描述】:

这是我为创建场景而编写的代码:

USE tempdb
GO
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'dbo.Emp') AND type in (N'U'))
DROP TABLE Emp
GO
CREATE TABLE Emp(
EmpID Int Identity(10,1) Primary Key,
EmpGroupID Int)
GO
INSERT INTO Emp(EmpGroupID) VALUES(1000)
INSERT INTO Emp(EmpGroupID) VALUES(1000)
INSERT INTO Emp(EmpGroupID) VALUES(1000)
INSERT INTO Emp(EmpGroupID) VALUES(2000)
INSERT INTO Emp(EmpGroupID) VALUES(2000)
INSERT INTO Emp(EmpGroupID) VALUES(2000)
INSERT INTO Emp(EmpGroupID) VALUES(3000)
GO
SELECT * FROM Emp
ORDER BY EmpGroupID,EmpID

我需要的是每个组都有一个计数器变量,递增 1,这样组 1000 的所有行的计数器 = 1,groupid = 2000 的计数器 = 2,groupid = 3000 的计数器 = 3。

SELECT ?,EmpID,EmpGroupID 
FROM Emp
ORDER BY EmpGroupID,EmpID
-- The result I'm looking for is:
1,10,1000
1,11,1000
1,12,1000
2,13,2000
2,14,2000
2,15,2000
3,16,3000

【问题讨论】:

  • 添加一个更具描述性的标题,并澄清您的问题。什么不符合您的预期?
  • 是的,你到底想做什么?
  • 编辑真的很有帮助。谢谢。
  • 为什么这里的人从不指定他们使用的是哪个 DBMS?似乎大多数人都暗示 SQL = MS SQL Server 。但是,请指定!

标签: sql count


【解决方案1】:

试试这个:

SELECT DENSE_RANK() OVER (ORDER BY EmpID) as 'counter',GroupID 
FROM Emp
ORDER BY counter, EmpGroupID

【讨论】:

  • SELECT DENSE_RANK() OVER (ORDER BY EmpGroupID) as 'counter', EmpGroupID FROM Emp ORDER BY counter, EmpGroupID
【解决方案2】:

您正在描述组的密集排名:

SELECT
  DENSE_RANK() OVER (ORDER BY EmpGroupID) as Counter,
  EmpID,
  EmpGroupID
FROM Emp
ORDER BY EmpGroupID,EmpID

这里有一些参考资料:http://msdn.microsoft.com/en-us/library/ms189798.aspx

【讨论】:

  • 嗯,我学到了一些新东西。我在这里,试图用数字表破解一些东西......
【解决方案3】:

我花了一段时间才明白你在问什么。据我了解,您想根据 EmpGroupID 创建和填充“计数器”列吗?如果是这样,那么是这样的:

SELECT EmpGroupID, EmpID,
    (SELECT COUNT(*) +1 
     FROM [table] 
     WHERE t2.EmpGroupID < t1.EmpGroupID GROUP BY t2.EmpGroupID
    ) AS Counter
FROM [table] t1
ORDER BY EmpGroupID, EmpID

【讨论】:

    【解决方案4】:

    您的意思是,您需要一个生成带有逗号的文本输出的查询?

    试试:

    SELECT Counter + ',' + EmpGroupID + ',' + EmpID
    FROM Table
    ORDER BY EmpGroupID
    

    【讨论】:

      【解决方案5】:

      根据你的描述猜测,你想要类似的东西

      选择 EmpGroupID、EmpID、COUNT(1) 作为计数器
      FROM 一些表名
      按 EmpGroupID、EmpID 分组
      ORDER BY COUNT(1), EmpGroupID, EmpID

      这是针对 SQL Server 的 - 在其他情况下您可以说

      ORDER BY 计数器、EmpGroupID、EmpID

      【讨论】:

      • 对于没有明确说明 Counter 不在表中,我深表歉意。
      • 你到底在数什么?请更新您的问题,以便我们帮助您找到答案。
      【解决方案6】:

      ORDER BY 可以有多个子句

      试试

      SELECT Counter,EmpGroupID, EmpID
      ORDER BY Counter,EmpGroupID, EmpID
      

      【讨论】:

      • 也就是说,如果你想要它,Counter -> EmpGroupID -> EmpID,如果你想要它在 Counter -> EmpID -> EmpGroupID 中只需交换最后两个值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-29
      • 1970-01-01
      • 2018-03-31
      • 1970-01-01
      • 2018-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多