Как написать оператор SQL SELECT для возврата значений ColumnA, где значения ColumnB = только для x и y и z - PullRequest
1 голос
/ 21 февраля 2020

в надежде, что кто-то сможет помочь с тем, что, я думаю, является довольно простым оператором T- SQL.

Используя таблицу ProductCommissionRates, ниже, я пытаюсь написать sql оператор, который будет возвращать все строки «ProdCode» из таблицы, где «ProdCode» имеет «CommRate» = «20», «25» и «30». Так что в приведенном ниже примере я ожидаю, что строки для ProdCode = 07053 будут возвращены только

ProdCode    CommRate    RateDesc
00130       10      Desc 17
00130       20      Desc 18
00130       25      Desc 19
00130       28      Desc 20
00130       30      Desc 21
00130       50      Desc 23
07053       20      Desc 11
07053       25      Desc 12
07053       30      Desc 13
07246       20      Desc 5
07246       25      Desc 6
07246       30      Desc 7
07246       50      Desc 8
07493       20      Desc 1
07493       25      Desc 2
07493       30      Desc 3
07493       50      Desc 4

Ответы [ 2 ]

1 голос
/ 22 февраля 2020

Если вас интересует только ProdCode, используйте это:

select ProdCode
from ProductCommissionRates
group by ProdCode
having 
  count(distinct case when CommRate in (20, 25, 30) then CommRate end) = 3
  and
  count(distinct CommRate) = 3

Если вам нужны также полные строки из таблицы, тогда:

select * from ProductCommissionRates
where ProdCode in (
  select ProdCode
  from ProductCommissionRates
  group by ProdCode
  having 
    count(distinct case when CommRate in (20, 25, 30) then CommRate end) = 3
    and
    count(distinct CommRate) = 3
)

См. демо . Результаты:

> ProdCode | CommRate | RateDesc
> -------: | -------: | :-------
>     7053 |       20 | Desc 11 
>     7053 |       25 | Desc 12 
>     7053 |       30 | Desc 13 
0 голосов
/ 22 февраля 2020

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

CREATE TABLE #t1(Prodcode varchar(10),CommRate int)
INSERT INTO #t1 VALUES('00130', 10)
INSERT INTO #t1 VALUES('00130', 25)
INSERT INTO #t1 VALUES('00130', 28)
INSERT INTO #t1 VALUES('00130', 30)
INSERT INTO #t1 VALUES('00130', 50)
INSERT INTO #t1 VALUES('07053', 20)
INSERT INTO #t1 VALUES('07053', 25)
INSERT INTO #t1 VALUES('07053', 30)
INSERT INTO #t1 VALUES('07246', 20)
INSERT INTO #t1 VALUES('07246', 25)
INSERT INTO #t1 VALUES('07246', 30)
INSERT INTO #t1 VALUES('07246', 50)

SELECT Prodcode
FROM #t1
WHERE CommRate in (20,25,30)
GROUP BY Prodcode
HAVING COUNT(*) = 3
EXCEPT
SELECT DISTINCT ProdCode
FROM #t1
WHERE CommRate NOT IN (20,25,30)

Если вам нужно получить описания для всех этих строк и поместить их в CTE и присоедините его обратно к столу так:

;WITH CTE AS
    (

    SELECT Prodcode
    FROM #t1
    WHERE CommRate in (20,25,30)
    GROUP BY Prodcode
    HAVING COUNT(*) = 3
    EXCEPT
    SELECT DISTINCT ProdCode
    FROM #t1
    WHERE CommRate NOT IN (20,25,30)
    )
SELECT tmp.* 
FROM #t1 tmp
INNER JOIN CTE t2 on tmp.Prodcode = t2.Prodcode
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...