2016-12-22 32 views
1

私は2つの値を持つテーブルを持っています:MACとID。T-SQL特定のインデックスで最小値と最大値の間で値を見つける

1つのIDは複数のMACを持つことができます。たとえば、次のように

:私の最終目標は、次のようにMACのスプリットを持つことである

enter image description here

enter image description here

私はIDの数をカウントする列数を、追加しました

enter image description here

私は、ケース・ステートメントを使用して正しい道にいると思う:

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 

しかし、それは明らかにこのような結果、私に与える:

enter image description here

だから私の質問はこれです:カウントが2つ以上ある場合はどうすればMAC2、MAC3、などを得るのですか?選択したインデックスタイプの関数はありますか?私はこれを考えすぎているのだろうか? MACは特定の順序である必要はありませんが、これは私がこれを行うと考えることができる最良の方法です。どんな助けもありがとうございます。 MAC_Nにそれを拡大するための

+1

が、私は最大カウントを取得し、その数オフに基づいてピボットを使用して列を作成したいです。 – scsimon

+0

@scsimon、私はピボットのことを聞いたことがあるが、これまでに一度も使ったことはない。もう少し説明できますか? – Nick

+1

SOのピボットとダイナミックピボットに関する多くの例がありますが、ここでは開始するために列名を取得する方法の例がありますhttp://rextester.com/NJOQ46585 – scsimon

答えて

1
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] 

推奨される方法:

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 
+0

あなたはN個のMACのためにそれをスケールアウトできますか? – scsimon

+0

これには動的SQLが必要です。私はそれがデバッグするのが非常に困難になるので(全てが文字列として書かれなければならないので)、そのルートに行かない方が良いと分かった。私の編集した答えに追加されたもののようなことをすることができますし、2つの[MAC_N]文字列を手動で置き換えるだけです。 –

+0

@mikemorrisそれは完璧に機能しました!私には1つの質問がある。私がそれをスケールアップしたいと思ったら、IDが4つのMACと4つのSNを持つことができ、MAC_1、MAC_2などを持っていたいと思っています.SN_1、SN_2、ピボット関数はそれを扱うことができますか?いずれにせよ、これは私が必要としていたものです。ありがとう! – Nick

0
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 
関連する問題