Non esiste un metodo infallibile per eseguire questa operazione in SQL Server 2000, con le condizioni specificate, ma quanto segue funzionerà per la maggior parte delle situazioni e ti avviserà se non funzionerà.
tabella riportata, "TBL":
ID Parameter
1 A
1 B
2 A
3 A
3 B
4 A
4 NULL
5 C
5 D
6 NULL
.
Creare questa funzione:
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
.
Poi questa query:
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
.
Darà quello che hai chiesto.
Risultati:
NumIDs NumParams ParamList
2 2 A, B
1 2 C, D
1 1 *null*, A
1 1 A
1 0 *null*
fonte
2010-06-15 00:42:37
Come si fa a rappresentare a zero i parametri? Un NULL nella colonna 'parameters' e un vincolo o trigger per impedire qualsiasi non NULL per lo stesso' id'? – pilcrow
@pilcrow: certo, c'è un'altra tabella con l'id oggetto come chiave primaria. – Eduardo