Вопрос группового запроса SQL; вычисление группы строк на основе значения одного поля - PullRequest
1 голос
/ 24 апреля 2010

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

Partid      Vendor     Defaultflag
1           A          1
2           B          0
2           C          0
3           D          0
3           E          0
3           F          1
4           G          0

Я хотел бы вернуть следующее:

Partid      Vendor
2           B
2           C
4           G

У меня явно проблемы с partid 3, и я получаю запрос, чтобы увидеть, что ему назначен поставщик по умолчанию.

Ответы [ 4 ]

4 голосов
/ 24 апреля 2010

И метод нулевого левого соединения:

SELECT vp0.Partid, vp0.Vendor
FROM VendorParts AS vp0
LEFT JOIN VendorParts AS vp1 ON vp1.Partid=vp0.Partid AND vp1.Defaultflag=1
WHERE vp1.Partid IS NULL
2 голосов
/ 24 апреля 2010

Вы можете попробовать что-то вроде

DECLARE @VendorParts TABLE(
        Partid INT,
        Vendor VARCHAR(10),
        Defaultflag INT
)
INSERT INTO @VendorParts SELECT  1,'A',1 
INSERT INTO @VendorParts SELECT  2,'B',0 
INSERT INTO @VendorParts SELECT  2,'C',0 
INSERT INTO @VendorParts SELECT  3,'D',0 
INSERT INTO @VendorParts SELECT  3,'E',0 
INSERT INTO @VendorParts SELECT  3,'F',1 
INSERT INTO @VendorParts SELECT  4,'G',0

SELECT *
FROM    @VendorParts vp
WHERE    NOT EXISTS (
                        SELECT  1 
                        FROM    @VendorParts 
                        WHERE   Partid = vp.Partid 
                        AND     Defaultflag = 1
                    )

выход

Partid      Vendor     Defaultflag
----------- ---------- -----------
2           B          0
2           C          0
4           G          0
1 голос
/ 24 апреля 2010

Используйте внутренний выбор, чтобы найти детали, у которых нет поставщика по умолчанию. Это те части, которые имеют MAX(Defaultflag) = 0 при группировании по partid. Затем вы можете присоединить это обратно к исходной таблице, чтобы получить все строки. Вот полный запрос:

SELECT T2.Partid, T2.Vendor
FROM (
    SELECT Partid
    FROM Table1
    GROUP BY Partid
    HAVING MAX(Defaultflag) = 0
) T1
JOIN Table1 T2
ON T1.PartId = T2.PartId

Результат:

2, 'B'
2, 'C'
4, 'G'
0 голосов
/ 24 апреля 2010

что-то вроде

select 
 partid, 
 vendor 
from 
 vendorparts 
where 
 partid not in (
  select 
    partid 
   from 
    vendorparts 
   where 
    defaultflag = 1
 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...