Выберите несколько строк, имеющих отдельные столбцы с условием - PullRequest
0 голосов
/ 11 мая 2018

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

Данные моей таблицы:

BookRef    BookFloor   BookSection    Orders    OrderType
-------    ---------   -----------    ------    ---------
   4           7            2          null         1
   4           7            2          null         3
   4           7            2          null         2
   4           7            2           8           2
   4           1            5          null         3

Для одного BookRef, в BookFloor, в BookSection, с отдельным OrderType, я хочу выбрать только строку, в которой есть Order. Если нет заказов, я хочу выбрать только одну строку.

Мой желаемый результат:

BookRef    BookFloor   BookSection    Orders    OrderType
-------    ---------   -----------    ------    ---------
   4           7            2          null         1
   4           7            2          null         3
   4           7            2           8           2
   4           1            5          null         3

Я пытаюсь использовать предложение HAVING. Однако это не работает. Как я могу выполнить свой код, чтобы сделать то, что мне нужно?

Мой запрос:

select BookRef, BookFloor, BookSection, Orders, OrderType
from #myTempTable
GROUP BY OrderType, Orders, BookSection, BookFloor, BookRef
having count(BookRef) = 1 and count(BookFloor) = 1 and (count(OrderType) = 1 or (count(OrderType) > 1 and count(Orders) = 1)) 

Ответы [ 4 ]

0 голосов
/ 11 мая 2018

Попробуйте ввести номер строки в разделе

SELECT * FROM (
   SELECT * ,ROW_NUMBER()OVER(PARTITION BY BookRef,BookFloor,BookSection,OrderType ORDER BY orders)  AS seq FROM MyTable
) AS t WHERE t.seq=1
0 голосов
/ 11 мая 2018

Ну, это также будет использовать GROUP BY:

select BookRef, BookFloor, BookSection, max(Orders) Orders, OrderType
from #myTempTable
where OrderType is not null -- May be Orders is not null
group by BookRef, BookFloor, BookSection, OrderType;

Однако, функция max() является избыточной, здесь вы можете напрямую использовать ее, как в GROUP BY предложении для уникальности .

0 голосов
/ 11 мая 2018

Я решил использовать предложение WHERE для решения своей проблемы.

select BookRef, BookFloor, BookSection, Orders, OrderType
from #myTempTable
where (select count(a.Id) from #myTempTable a 
         where a.BookRef = t.BookRef and a.BookFloor = t.BookFloor and a.BookSection = t.BookSection and a.OrderType = t.OrderType) = 1
      or t.Orders is not null

Однако я пока не знаю, есть ли более простой способ сделать то же самое с предложением HAVING.

0 голосов
/ 11 мая 2018

Это запрос расстановки приоритетов.Один из методов:

select t.*
from #temp t
where t.OrderType is not null
union all
select t.*
from #temp t
where t.OrderType is null and
      not exists (select 1 from #temp t2 where t2.ordertype = t.ordertype and t2.bookref and t2.booksection = t.booksection and t2.bookfloor = t.bookfloor and t2.ordertype is null);
...