Создание стержня на основе правил

У меня есть набор данных вроде:

+---------------+----+ | Grade | ID | +---------------+----+ | Copper | 1 | +---------------+----+ | Copper | 2 | +---------------+----+ | Copper Bonded | 2 | +---------------+----+ | Fiber | 3 | +---------------+----+ | Fiber | 4 | +---------------+----+ 

Я бы хотел получить такой результат:

 +----+--------+ | ID | Copper | +----+--------+ | 1 | A | +----+--------+ | 2 | B | +----+--------+ | 3 | C | +----+--------+ | 4 | C | +----+--------+ 

Набор правил выглядит примерно так:

 A : Copper only B : Copper and Copper Bonded C : Fiber only 

Является ли это кандидатом для стержня, как я могу выразить это как sql-запрос?

Я использовал ограниченный трюк и оценил это:

 create table #temp (grade varchar(100),id int) insert into #temp values ('Copper',1) ,('Copper',2) ,('Copper bonded',2) ,('Fiber',3) ,('Fiber',4) ;with cte as ( select distinct id,stuff((select '|' + grade from #temp where id = t1.id group by grade order by grade for xml path('') ),1,1,'') as Combined from #temp t1 ) select id, case combined when 'Copper' then 'A' when 'Copper|Copper Bonded' then 'B' when 'Fiber' then 'C' else 'Unknown' end as Copper from cte drop table #temp 

Результаты:

 id Copper 1 A 2 B 3 C 4 C 

Хорошо, вам обязательно нужно использовать CASE, и это сложно, и вы только дали нам «что-то вроде этого» набора правил, поэтому я дам вам несколько psuedocode, чтобы указать вам направление решения, и ваш окончательный код будет «что-то вроде этого» в зависимости от ваших фактических правил:

 SELECT DISTINCT ID, CASE WHEN EXISTS(SELECT a row with this ID WHERE Grade='Copper') AND EXISTS(SELECT a row with this ID WHERE Grade='Copper Bonded') AND NOT EXISTS(SELECT a row with this ID WHERE Grade is something other than 'Copper' or 'Copper Bonded') THEN 'B' WHEN EXISTS(SELECT a row with this ID WHERE Grade='Copper') AND NOT EXISTS(SELECT a row with this ID WHERE Grade is something other than 'Copper') THEN 'A' WHEN ... {by now you should be starting to get the idea} END AS Copper FROM MyTable t1 --be sure to alias your table so you can correlate your EXISTS subqueries 

Это действительно странный случай и условия, но здесь есть идея:

 CREATE TABLE T ( ID INT IDENTITY (1,1), GRADE VARCHAR(25) ); INSERT INTO T VALUES ('Copper'), ('Copper'), ('Copper Bonded'), ('Fiber'), ('Fiber'); with cte as ( SELECT ID, GRADE, row_number () over (partition by grade order by id) rn FROM T ), Final as ( select id, case when grade = 'Copper'and rn = 1 then 'A' when grade= 'Copper Bonded' then 'B' when grade = 'Fiber' then 'C' end k from cte) select row_number () over (order by k) id,k as Copper from final where k is not null 

Результаты:

 +----+--------+ | id | Copper | +----+--------+ | 1 | A | | 2 | B | | 3 | C | | 4 | C | +----+--------+ 
Давайте будем гением компьютера.