binu.emiliya Ответов: 3

Исключение записей с помощью подзапроса в SQL SERVER


Привет,

Я не специалист по SQL.У меня есть таблица, где данные вводятся неправильным скороговоркой.Я должен исключить некоторые записи (я не могу удалить), я пытаюсь создать представление.
Пробовал с подзапросами, но у меня не получилось

вот мои данные

stid	Ayear	Aterm	Award	Details
43	2014	fall      		
43	2015	fall      HONOR	   Honor List
43	2015	spring    	      good
43	2016	spring    	      good
43	2016	spring    HONOR	   Honor List
45	2014	fall      		
45	2015	fall      PRESIDENT PresidentList
45	2015	spring    	      good
45	2016	spring    	      good
45	2016	spring   HONOR	   Honor List 


я хочу исключить строку с подробностями "хорошо", когда есть список почета в том же году и семестре

для студента 45 в 2016 году весной у нас есть хороший и почетный список
в этом случае нам нужно удалить запись с "хорошим"
и сохранить список почетных гостей как таковой



Это структура таблицы

CREATE TABLE [dbo].[testawards](
	[stid] [int] NULL,
	[Ayear] [int] NULL,
	[Aterm] [nchar](10) NULL,
	[Award] [nvarchar](50) NULL,
	[Details] [nvarchar](max) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]


Выборочные данные
insert into testawards  (stid,Ayear,Aterm,Award,Details) values (43,2014,'fall','','')
insert into testawards  (stid,Ayear,Aterm,Award,Details) values (43,2015,'fall','HONOR','Honor List')
insert into testawards  (stid,Ayear,Aterm,Award,Details) values (43,2015,'spring','','good')
insert into testawards  (stid,Ayear,Aterm,Award,Details) values (43,2016,'spring','','good')
insert into testawards  (stid,Ayear,Aterm,Award,Details) values (43,2016,'spring','HONOR','Honor List')
insert into testawards  (stid,Ayear,Aterm,Award,Details) values (45,2014,'fall','','')
insert into testawards  (stid,Ayear,Aterm,Award,Details) values (45,2015,'fall','PRESIDENT','PresidentList')
insert into testawards  (stid,Ayear,Aterm,Award,Details) values (45,2015,'spring','','good')
insert into testawards  (stid,Ayear,Aterm,Award,Details) values (45,2016,'spring','','good')
insert into testawards  (stid,Ayear,Aterm,Award,Details) values (45,2016,'spring','HONOR','Honor List')

What I have tried:

I tried with Subqueries but not worked .
just took the count of records with same term and year then if there is Honor ,but this is not worked for me

Maciej Los

-- опубликовано за ошибку --

3 Ответов

Рейтинг:
14

Wendelius

Если я правильно понимаю ваше требование,вот один вариант, который вы можете попробовать.

SELECT *
FROM  testawards ta
WHERE ta.Details = 'Good'
AND   NOT EXISTS ( SELECT 1
                   FROM testawards ta2
                   WHERE ta2.stid  = ta.stid
                   AND   ta2.Ayear = ta.Ayear
                   AND   ta2.Aterm = ta.Aterm
                   AND   ta2.Award = 'HONOR')


РЕДАКТИРОВАТЬ:
Если записи с чем-то другим, чем 'Good' нужно быть включенным, попробуйте варьировать следующим образом:
SELECT *
FROM  testawards ta
WHERE ta.Details <> 'Good'
OR   NOT EXISTS ( SELECT 1
                  FROM testawards ta2
                  WHERE ta2.stid  = ta.stid
                  AND   ta2.Ayear = ta.Ayear
                  AND   ta2.Aterm = ta.Aterm
                  AND   ta2.Award = 'HONOR')


binu.emiliya

Привет Мика,

Спасибо.Но это исключает все хорошие и нулевые записи
Мне нужно держать одну строку для каждого семестра и года.

Wendelius

Хорошо, смотрите обновленный ответ.

Maciej Los

5ед!

binu.emiliya

Идеально! Спасибо Мика

Рейтинг:
0

Maciej Los

Чтобы иметь возможность исключить некоторые данные, вам необходимо использовать Существует[^] или КРОМЕ[^] метод.

Например:

SELECT *
FROM @testawards
WHERE Details <> 'good'
EXCEPT
SELECT *
FROM @testawards 
WHERE Details = 'good'


Другой способ-использовать JOIN'ы. См. Решение 1 по David_Wimbley[^]. Для получения более подробной информации о том, как JOINс работы, вижу: Визуальное представление SQL-соединений[^]

[РЕДАКТИРОВАТЬ]
Бину.Эмилия[^] писанное:
студент 43 на семестр 2015 Весна нет чести так что мне нужно сохранить эту запись


Выше ответ на David_Wimbley[^] ответ немного сбивает с толку.
Я проверил это с помощью pivot:

SELECT stid, AYear, [spring], [fall]
FROM (
	SELECT stid, AYear, Aterm, Details 
	FROM @testawards
	) AS DT
PIVOT (MAX(Details) FOR Aterm IN([spring], [fall])) AS PT
ORDER BY PT.stid, PT.Ayear 

и вот мой результат
stid	AYear	spring		fall
43		2014	NULL	
43		2015	good		Honor List
43		2016	Honor List	NULL
45		2014	NULL	
45		2015	good		PresidentList
45		2016	Honor List	NULL


Так что вы должны подумать об этом.


binu.emiliya

Привет Мацей Лос,

Спасибо.Я использовал Exists но не получил того результата который искал
В вашем решении я вижу, что он исключен весной 2015 года .
Если нет чести и детали хороши мне нужно сохранить эту запись
так что будет запись на каждый семестр.
Спасибо за Вашу поддержку

Maciej Los

См. раздел Обновление ответа.

binu.emiliya

Спасибо Мацей,

Я использовал сценарий Мики и работал ! Большое вам спасибо за ваши усилия

Member 13598595

милый

Member 13598595

cvvvb

Рейтинг:
0

David_Wimbley

Я думаю, что это дает то, что вы ищете. Кроме того, спасибо Вам за предоставление схемы и образцов данных, которые сделали вашу помощь намного проще.

    SELECT B.* FROM 
(SELECT 
    stid,  
    ayear, 
    aterm 
 FROM @testawards
 GROUP BY stid, ayear, aterm
 HAVING COUNT(*) > 1) AS A
 RIGHT JOIN @testawards AS B ON B.stid = A.stid AND b.Ayear = A.Ayear AND B.Aterm = A.Aterm
WHERE B.Details <> 'good'


Maciej Los

Хорошая работа, Дэвид.

binu.emiliya

Привет, Дэвид, большое тебе спасибо.Я должен создать схему и образцы данных, чтобы облегчить вашу работу :)
Это очень близко к моему результату, но он исключает строки, которые имеют детализацию как "хорошие"
Для каждого семестра ,если у меня есть какой-либо почетный список, я должен исключить "хорошую" запись
Для первого (награда и деталь как") есть еще одно исключение, которое мы должны сохранить как таковое ( этот термин для этого студента-основа, так что нет ни чести, ни добра)



вот такие сценарии

1. награда и деталь ноль или пробел ( не ноль) - держите его таким же

2. премия равна нулю или космическая деталь хороша - если есть другая запись в этом семестре и Году
исключите его еще (если нет почетного списка в этом семестре и семестре), нужно вести эту запись

например, студент 43 для семестра 2015 года весной нет чести, поэтому мне нужно сохранить эту запись с хорошим как таковым.
Но весной 2016 года вы можете увидеть два рекорда: один-честь, а второй-хорошо.В этом случае я должен сохранить честь. Я надеюсь, что мое объяснение будет хорошим

спасибо снова

Maciej Los

Студент 43 года был награжден дважды: весной - "хорошо" и осенью - "Почетный лист". Я проверил его с помощью pivot:
stid AYear spring fall
43 2014 NULL
43 2015 good Honor List
-^ ^ ^ ^
43 2016 Honor List NULL
45 2014 NULL
45 2015 good PresidentList
45 2016 Honor List NULL