Il n'existe pas de méthode infaillible pour ce faire dans SQL Server 2000, avec les conditions spécifiées, mais ce qui suit fonctionnera dans la plupart des situations et il vous avertira si cela ne fonctionne pas.
table donnée, "TBL":
ID Parameter
1 A
1 B
2 A
3 A
3 B
4 A
4 NULL
5 C
5 D
6 NULL
.
Créer cette fonction:
CREATE FUNCTION MakeParameterListFor_tblID (@ID INT)
RETURNS VARCHAR(8000)
AS
BEGIN
DECLARE
@ParameterList VARCHAR(8000),
@ListLen INT
SET
@ParameterList = ''
SELECT
@ParameterList = @ParameterList + COALESCE (Parameter, '*null*') + ', '
FROM
tbl
WHERE
ID = @ID
ORDER BY
Parameter
SET @ListLen = LEN (@ParameterList)
IF @ListLen > 7800 -- 7800 is a SWAG.
SET @ParameterList = '*Caution: overflow!*' + @ParameterList
ELSE
SET @ParameterList = LEFT (@ParameterList, @ListLen-1) -- Kill trailing comma.
RETURN @ParameterList
END
GO
.
Ensuite, cette requête:
SELECT
COUNT (ID) AS NumIDs,
NumParams,
ParamList
FROM
(
SELECT
ID,
COUNT (Parameter) AS NumParams,
dbo.MakeParameterListFor_tblID (ID) AS ParamList
FROM
tbl
GROUP BY
ID
) AS ParamsByID
GROUP BY
ParamsByID.ParamList,
ParamsByID.NumParams
ORDER BY
NumIDs DESC,
NumParams DESC,
ParamList ASC
.
Donnez ce que vous avez demandé.
Résultats:
NumIDs NumParams ParamList
2 2 A, B
1 2 C, D
1 1 *null*, A
1 1 A
1 0 *null*
Comment représenter zéro paramètres? Une valeur NULL dans la colonne 'parameters' et une contrainte ou un trigger pour empêcher tout non-NULL pour ce même' id'? – pilcrow
@pilcrow: Bien sûr, il existe une autre table avec l'ID d'objet en tant que clé primaire. – Eduardo