Условно возвращать записи на основе комбинации значений полей - PullRequest
0 голосов
/ 20 сентября 2011

Я новичок в этом форуме и sql и надеялся, что кто-нибудь сможет мне помочь.

Я пытаюсь создать запрос, который будет возвращать записи с одинаковыми значениями во всех полях, кроме одного.

У меня есть следующие поля в таблице:

Номер детали | Год выпуска | Марка | Модель

Я хочу вернуть все записи, которые доступны в течение одного года (2011 г.), но недоступны в другом (2012 г.). Например:

Номер детали | Год выпуска | Марка | Модель
123456 | 2011 | Форд | Фокус

Эта запись вернется, потому что нет комбинации 123456 | 2012 | Ford | Focus.

Однако я не хочу, чтобы какие-либо записи возвращались, если есть запись за 2012 год.

Номер детали | Год выпуска | Марка | Модель
123456 | 2011 | Форд | Фокус
123456 | 2012 | Форд | Фокус

Записи не должны возвращаться, если это условие существует.

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

Заранее спасибо!

Редактировать :

Это выглядит правильно?

SELECT *
FROM [mytable].[dbo].[apps] yt
    WHERE yt.make in (47,54, 48, 59, 3, 42, 21, 67, 1168, 76, 40, 39)
    and yt.model in (432, 2484, 16206, 2487, 6831, 5858, 659, 663, 2816, 688, 668, 670, 6089, 2427, 752, 21, 349, 356, 108, 883, 2440, 16227, 1011, 303, 6867, 110, 440, 975, 286, 287)
    and yt.Year = 2011
        AND NOT EXISTS(SELECT NULL
                           FROM [mytable].[dbo].[apps] yt2
                           WHERE yt.part# = yt2.part#
                               AND yt.make = yt2.make
                               AND yt.model = yt2.model
                               AND yt2.Year = 2012)
order by part#

Ответы [ 3 ]

0 голосов
/ 20 сентября 2011

Попробуйте

SELECT c.PartNumber, c.Year, c.Make, c.Model
FROM Cars c
inner join 
(
    SELECT count(*) [count], PartNumber, Make, Model
    from cars
    GROUP BY PartNumber, Make, Model
    HAVING count(*) = 1
) as g 
ON c.PartNumber = g.PartNumber and c.Make = g.Make and c.Model = g.Model

С этим кодом настройки

create table Cars
(partnumber nvarchar(20), [year] int, make nvarchar(20), model nvarchar(20))

insert into Cars
select '123456', 2010, 'Ford', 'Focus'
union
select '123456', 2011, 'Ford', 'Focus'
union
select '654321', 2010, 'Opel', 'Astra'

возвращает

PartNumber    Year    Make    Model
654321        2010    Opel    Astra
0 голосов
/ 21 сентября 2011

попытка

SELECT t.PartNumber, t.Yr, t.Make, t.Model, t2.yr
FROM cars t left outer join cars t2 on 
    t.PartNumber = t2.PartNumber
    AND t.Make = t2.Make
    AND t.Model = t2.Model
    and t.yr <> t2.yr 
WHERE t.Yr = 2011   AND (t2.yr <> 2012 or t2.Yr  is null)

должна обрабатывать

   part   make  model   yr 
   123456 Ford  Focus   2012 
   123456 Ford  Focus   2011 
   654321 Opel  Astra   2011 
   987654 Dodge Charger 2010 
   987654 Dodge Charger 2011

возврат

part    yr      make    model   t2.yr
654321  2011    Opel    Astra   NULL
987654  2011    Dodge   Charger 2010
0 голосов
/ 20 сентября 2011
SELECT yt.PartNumber, yt.Year, yt.Make, yt.Model
    FROM YourTable yt
    WHERE yt.Year = 2011
        AND NOT EXISTS(SELECT NULL
                           FROM YourTable yt2
                           WHERE yt.PartNumber = yt2.PartNumber
                               AND yt.Make = yt2.Make
                               AND yt.Model = yt2.Model
                               AND yt2.Year = 2012)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...