2009-06-01 8 views
1

Voici le code que j'ai écrit pour créer un scénario:SQL Select compteur par groupe

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 

Ce que j'ai besoin est pour chaque groupe d'avoir une variable compteur, incrémente de 1, de sorte que toutes les lignes pour le groupe 1000 ont le compteur = 1, le groupid = 2000 a le compteur = 2, le groupid = 3000 a le compteur = 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 
+0

Ajoutez un titre plus descriptif et clarifiez votre question. Qu'est-ce qui ne fonctionne pas comme prévu? –

+0

oui, exactement qu'est-ce que vous essayez de faire? – Malfist

+0

Les modifications ont vraiment aidé. Merci. –

Répondre

4

Vous décrivez un classement dense de groupes:

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

Et voici quelques documents de référence: http://msdn.microsoft.com/en-us/library/ms189798.aspx

+0

Eh bien, j'ai appris quelque chose de nouveau. J'étais là, essayant de pirater quelque chose avec des tables de nombres ... –

3

ORDER BY peut avoir plus d'une clause

Essayez

SELECT Counter,EmpGroupID, EmpID 
ORDER BY Counter,EmpGroupID, EmpID 
+0

Si vous le voulez, Counter -> EmpGroupID -> EmpID, si vous le voulez dans Counter -> EmpID -> EmpGroupID permutez simplement les deux dernières valeurs. – Malfist

1

Deviner de votre description, voulez-vous quelque chose comme

SELECT EmpGroupID, EmpID, COUNT (1) AS Counter
FROM un nom de table
GROUP BY EmpGroupID, EmpID
ORDER BY COUNT (1), EmpGroupID, EMPID

C'est pour SQL Server - dans d'autres cas, vous pourriez être en mesure de dire

ORDER BY contre, EmpGroupID, EmpID

+0

Je m'excuse de ne pas avoir précisé que Counter n'était pas dans la table. –

+0

Que comptez-vous exactement? Veuillez mettre à jour votre question afin que nous puissions vous aider à trouver une réponse. – Malfist

4

Vous voulez dire, vous avez besoin une requête qui produit une sortie textuelle avec les virgules comme indiqué?

Essayez:

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

Il m'a fallu un certain temps pour comprendre ce que vous demandez. Si je comprends bien, vous voulez créer et remplir la colonne 'Counter' basée sur le EmpGroupID? Si oui, alors quelque chose comme ceci:

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

Essayez ceci:

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

SELECT DENSE_RANK() OVER (ORDER BY EmpGroupID) comme 'counter', EmpGroupID FROM Emp ORDER BY, counter, EmpGroupID –