У меня плохо спроектированная таблица, в которой есть смесь строк и столбцов, где, вероятно, следовало бы иметь 1 строку со множеством столбцов или какой-то другой дизайн целиком. Но эта ошибка была 20 лет назад, на чужих часах.
Прямо сейчас я достигаю той цели, которую хочу, множеством самосоединений. Это мучительно медленно.
Следующее настроит меня как сейчас:
declare @client table
(
clientNumber int,
name varchar(10)
)
insert into @client values (1, 'Bob');
insert into @client values (2, 'Alice');
declare @options table
(
clientNumber int,
optionKey varchar(4),
optionValue1 int,
optionValue2 int,
optionValue3 int
)
insert into @options values (1, 'optA', 1, 1, 0);
insert into @options values (1, 'optB', 0, 1, 0);
insert into @options values (2, 'optA', 1, 1, 1);
insert into @options values (2, 'optC', 0, 0, 1);
select c.clientNumber, c.name,
oA.optionValue1 as [Graduated],
oA.optionValue2 as [Employed],
oA.optionValue3 as [Married],
oB.optionValue1 as [HasPets],
oB.optionValue2 as [LikesThai],
oB.optionValue3 as [MathWiz],
oC.optionValue1 as [DrvLicense],
oC.optionValue2 as [Registered],
oC.optionValue3 as [Outdoorsy]
from @client c
left outer join @options oA
on oA.clientNumber = c.clientNumber and oA.optionKey = 'optA'
left outer join @options oB
on oB.clientNumber = c.clientNumber and oB.optionKey = 'optB'
left outer join @options oC
on oC.clientNumber = c.clientNumber and oC.optionKey = 'optC'
Для этих результатов:
![result set from above query](https://i.stack.imgur.com/qERSs.png)
Набор результатов - именно то, что я хочу. Не у каждого клиента есть запись A, B или C, поэтому null
в наборе результатов в порядке. Я не могу найти подобный пример через некоторое время поиска, поэтому я не уверен, что PIVOT
действительно то, что я ищу. Предложения?
Обновление:
похоже, это дает те же результаты. Я собираюсь проверить его на более крупном случае, чтобы увидеть, быстрее ли он, чем все самостоятельные соединения. (Я подозреваю, что это так). Я все еще хотел бы знать, не лает ли я не тем деревом с помощью шарниров.
select clientNumber,
Min(Case o.optionKey when 'optA' then o.optionValue1 end) [Graduated],
Min(Case o.optionKey when 'optA' then o.optionValue2 end) [Employed],
Min(Case o.optionKey when 'optA' then o.optionValue3 end) [Married],
Min(Case o.optionKey when 'optB' then o.optionValue1 end) [HasPets],
Min(Case o.optionKey when 'optB' then o.optionValue2 end) [LikesThai],
Min(Case o.optionKey when 'optB' then o.optionValue3 end) [MathWix],
Min(Case o.optionKey when 'optC' then o.optionValue1 end) [DrvLicense],
Min(Case o.optionKey when 'optC' then o.optionValue2 end) [Registered],
Min(Case o.optionKey when 'optC' then o.optionValue3 end) [Outdoorsy]
from @options o
group by clientnumber