Es gibt keinen idiotensicheren Weg, dies in SQL Server 2000 zu tun, mit den angegebenen Bedingungen, aber das Folgende wird für die meisten Situationen funktionieren und es wird Sie warnen, wenn es nicht funktioniert.
Bei Tisch "Tabl":
ID Parameter
1 A
1 B
2 A
3 A
3 B
4 A
4 NULL
5 C
5 D
6 NULL
.
Erstellen Sie diese Funktion:
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
.
Dann ist diese Abfrage:
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
.
Geben Sie, was Sie gefragt haben.
Ergebnisse:
NumIDs NumParams ParamList
2 2 A, B
1 2 C, D
1 1 *null*, A
1 1 A
1 0 *null*
Wie stellen Sie Null-Parameter? Ein NULL in der 'Parameter'-Spalte und eine Einschränkung oder ein Auslöser, um irgendwelche Nicht-NULL für dieselbe 'ID' zu verhindern? – pilcrow
@pilcrow: Sicher, es gibt eine andere Tabelle mit der Objekt-ID als Primärschlüssel. – Eduardo