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
我有一个 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