あなたのデータ構造ID「デ私の場合には有用ではありません常に後続の処理をより困難にする「標準化された」(または「ピボットされた」)。したがって、最初のステップは、次のステップをより簡単にするためにそのデータを「正規化」(または「ピボット解除」)することです。
これを実行するには、「unpivot」コマンドを使用する必要はありません。SQL Serverでは、最初の部分(以下のCTE)を達成するために、CRUSS APPLYとVALUESを使います。次に、 "FOR XML PATH"とSTUFF()を使用してカンマ区切りの文字列を実現します。
次のサンプルデータから:
CREATE TABLE Table1
([id] int, [lh1] bit, [lh2] bit, [lh3] bit, [lh4] bit, [rh1] bit, [rh2] bit, [rh3] bit, [rh4] bit)
;
INSERT INTO Table1
([id], [lh1], [lh2], [lh3], [lh4], [rh1], [rh2], [rh3], [rh4])
VALUES
(1001, 1, 0, 0, 0, 0, 0, 1, 0),
(1002, 0, 1, 0, 0, 1, 0, 0, 0),
(1003, 0, 0, 1, 0, 0, 1, 0, 0),
(1004, 0, 1, 0, 1, 0, 0, 1, 0),
(1005, 1, 0, 1, 0, 0, 1, 0, 1),
(1006, 0, 0, 0, 0, 1, 0, 1, 0),
(1007, 1, 0, 0, 1, 0, 0, 0, 0),
(1008, 0, 1, 1, 0, 1, 0, 0, 1)
;
してから、このクエリ:
;with CTE as (
select
id, ca.colname, colvalue
from table1
cross apply (
values
('lh1',case when lh1 = 1 then 1 end)
, ('lh2',case when lh2 = 1 then 2 end)
, ('lh3',case when lh3 = 1 then 3 end)
, ('lh4',case when lh4 = 1 then 4 end)
, ('rh1',case when rh1 = 1 then 1 end)
, ('rh2',case when rh2 = 1 then 2 end)
, ('rh3',case when rh3 = 1 then 3 end)
, ('rh4',case when rh4 = 1 then 4 end)
) ca (colname, colvalue)
where ca.colvalue IS NOT NULL
)
SELECT
t.id, l.h as lh, r.h as rh
FROM table1 t
CROSS APPLY (SELECT
STUFF((SELECT
',' + CAST(cte.colvalue AS char(1))
FROM cte
WHERE t.id = cte.id
AND cte.colname like 'lh%'
ORDER BY cte.colname
FOR xml PATH (''))
, 1, 1, '')) AS l (h)
CROSS APPLY (SELECT
STUFF((SELECT
',' + CAST(cte.colvalue AS char(1))
FROM cte
WHERE t.id = cte.id
AND cte.colname like 'rh%'
ORDER BY cte.colname
FOR xml PATH (''))
, 1, 1, '')) AS r (h)
select
id, ca.colname, colvalue
from table1
cross apply (
values
('lh1',case when lh1 = 1 then 1 end)
, ('lh2',case when lh2 = 1 then 2 end)
, ('lh3',case when lh3 = 1 then 3 end)
, ('lh4',case when lh4 = 1 then 4 end)
, ('rh1',case when rh1 = 1 then 1 end)
, ('rh2',case when rh2 = 1 then 2 end)
, ('rh3',case when rh3 = 1 then 3 end)
, ('rh4',case when rh4 = 1 then 4 end)
) ca (colname, colvalue)
where ca.colvalue IS NOT NULL
order by id, colname, colvalue
あなたはこの結果を得る:
+----+------+------+------+
| | id | lh | rh |
+----+------+------+------+
| 1 | 1001 | 1 | 3 |
| 2 | 1002 | 2 | 1 |
| 3 | 1003 | 3 | 2 |
| 4 | 1004 | 2,4 | 3 |
| 5 | 1005 | 1,3 | 2,4 |
| 6 | 1006 | NULL | 1,3 |
| 7 | 1007 | 1,4 | NULL |
| 8 | 1008 | 2,3 | 1,4 |
+----+------+------+------+
あなたは、MySQLとSQL-Serverデータベースの両方を使用していますか?それぞれのDBMSだけに親切にタグを付けない場合は、 – Viki888
私はSQL Serverを使用しています。 – Hitesh
列名は常に2文字と1つの数字ですか? – Shnugo