T-SQL 在特定索引处查找最小值和最大值之间的值

T-SQL Find Values Between Min and Max at specific Index

我有一个 table 有 2 个值:MAC 和 ID。

一个ID可以有多个MAC。例如:

我添加了一个计数列,用于计算 ID 的数量:

我的最终目标是让 MAC 像这样分开:

我认为我在正确的轨道上使用 case 语句:

select count, ID,
MAC1 = case
when count >0 then min(MAC) end,
MAC2 = case 
when count = 2 then max(MAC) end,
MAC3 = case
when count = 3 then max(MAC) end,
MAC4 = case
when count = 4 then max(MAC) end from MACTABLE

但这显然给了我这样的结果:

所以我的问题是:如果计数大于 2,我如何获得 MAC2、MAC3 等?是否有选择的索引类型功能?我是不是想多了? MAC 不需要按特定顺序排列,这是我能想到的最佳方式。感谢任何帮助。

CREATE TABLE [MAC$] (
    [ID] int,
    [MAC] varchar(10)
)
INSERT [dbo].[MAC$] ([ID], [MAC]) VALUES (1, N'120034')
INSERT [dbo].[MAC$] ([ID], [MAC]) VALUES (1, N'567869')
INSERT [dbo].[MAC$] ([ID], [MAC]) VALUES (1, N'741AB00')
INSERT [dbo].[MAC$] ([ID], [MAC]) VALUES (2, N'185AZ1')
INSERT [dbo].[MAC$] ([ID], [MAC]) VALUES (2, N'FD8978')
INSERT [dbo].[MAC$] ([ID], [MAC]) VALUES (3, N'H85HLK')
GO
SELECT * FROM
(SELECT Id, CAST([Mac] as varchar(10)) as val, 'MAC_' + CAST(DENSE_RANK() OVER (PARTITION BY Id ORDER BY Id, Mac) as varchar(10)) as namePivot FROM [Mac$] WHERE LEN(Mac)>0) as data
PIVOT (MAX(val) FOR namePivot in ([MAC_1],[MAC_2],[MAC_3],[MAC_4],[MAC_5])) as P
GROUP BY Id,[MAC_1],[MAC_2],[MAC_3],[MAC_4],[MAC_5]

将其扩展到 MAC_N 的推荐方法:

DECLARE @sColMac varchar(MAX);
DECLARE @iNumMac int;
SET @iNumMac = 1;
WHILE @iNumMac <= 5
    BEGIN
    SELECT @sColMac = COALESCE(@sColMac + ',', '') + QUOTENAME('MAC_' + CONVERT(varchar(10),@iNumMac))
    SET @iNumMac = @iNumMac + 1
    END

SELECT @sColMac
SELECT * 
FROM

    (
    select case when x.COUNTID = 1 then 'MAC1' when x.COUNTID = 2 then 'MAC2' when x.COUNTID = 3 then 'MAC3' when x.COUNTID = 4 then 'MAC4' end MAC
            ,ID
            ,COUNTID
    from
        ( -- YOUR ORIGINAL (COUNT) QUERY-----
            select mac
                    ,ID
                    ,count(ID) COUNTID
            from YOUR_TABLE
            group by mac, ID
        ) x
    ) SRC
pivot(
    sum(COUNTID)
    for mac in ([MAC1], [MAC2], [MAC3], [MAC4])) piv