Счетчик выбора SQL по группам - PullRequest
2 голосов
/ 01 июня 2009

Вот код, который я написал для создания сценария:

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 было counter = 1, в groupid = 2000 было counter = 2, в groupid = 3000 было counter = 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

Ответы [ 6 ]

5 голосов
/ 02 июня 2009

Вы описываете плотный рейтинг групп:

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

4 голосов
/ 01 июня 2009

Вы имеете в виду, вам нужен запрос, который производит текстовый вывод с запятыми, как показано?

Попытка:

SELECT Counter + ',' + EmpGroupID + ',' + EmpID
FROM Table
ORDER BY EmpGroupID
3 голосов
/ 01 июня 2009

ORDER BY может содержать более одного предложения

Попробуйте

SELECT Counter,EmpGroupID, EmpID
ORDER BY Counter,EmpGroupID, EmpID
1 голос
/ 14 августа 2009

Попробуйте это:

SELECT DENSE_RANK() OVER (ORDER BY EmpID) as 'counter',GroupID 
FROM Emp
ORDER BY counter, EmpGroupID
1 голос
/ 01 июня 2009

Мне потребовалось некоторое время, чтобы понять, о чем ты спрашиваешь. Насколько я понимаю, вы хотите создать и заполнить столбец «Счетчик» на основе 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
1 голос
/ 01 июня 2009

Догадываясь из вашего описания, хотите ли вы что-то вроде

ВЫБРАТЬ EmpGroupID, EmpID, COUNT (1) Счетчик AS
ОТ некоего имени таблицы
GROUP BY EmpGroupID, EmpID
ЗАКАЗАТЬ ПО СЧЕТУ (1), EmpGroupID, EmpID

Это для SQL Server - в других случаях вы можете сказать

ORDER BY Counter, EmpGroupID, EmpID

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...