在指定條件下,在SQL Server 2000中沒有萬無一失的方法來執行此操作,但以下方法適用於大多數情況,它會在您無法正常工作時發出警告。
給定的表, 「TBL」:
ID Parameter
1 A
1 B
2 A
3 A
3 B
4 A
4 NULL
5 C
5 D
6 NULL
。
創建此功能:
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
。
那麼這個查詢:
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
。
將提供你所要求的。
結果:
NumIDs NumParams ParamList
2 2 A, B
1 2 C, D
1 1 *null*, A
1 1 A
1 0 *null*
你怎麼代表零個參數? 'parameters'列中的NULL以及一個約束或觸發器,以防止對於相同'id'的任何非NULL值? – pilcrow 2010-06-15 16:40:37
@pilcrow:當然,還有另一個表的對象ID作爲主鍵。 – Eduardo 2010-06-22 22:00:32