Mam takie proste zapytanie:
SELECT * FROM orders
który zwraca wszystkie zamówienia, proste.
Chciałbym dodać opcjonalne parametry do mojego zapytania.
DECLARE @group INT;
SET @group = 1 --IT1
SELECT * FROM orders WHERE group = isnull(@group, group)
To też działa dobrze.
Mój problem polega na tym, że potrzebuję drugiego parametru, takiego jak:
DECLARE @group INT;
SET @group = 1 --IT1
DECLARE @department VARCHAR(8);
SET @department = "IT"
SELECT * FROM orders WHERE /*and here add limitation with department*/ group = isnull(@group, group)
Moja tabela zamówień ma kolumnę GROUP, ale nie ma kolumny DEPARTMENT.
Sytuacja wygląda tak: Mam 2 kombinatory. Jeden dla działów, drugi dla grupy. Najpierw mam opcje:
- Wszystko
- TO
- CALL CENTER
Drugi jest wypełniany, gdy użytkownik wybierze coś z combo1. Jeśli wybierze IT, w polu kombi grupy będą dostępne opcje:
- Wszystko
- IT1
- IT2
Jeśli użytkownik wybierze z pierwszego działu kombinacji, a następnie zgrupuje, jest to łatwe, ponieważ wtedy sprawdzam tylko grupę.
Problem polega na tym, że chce wszystkich zamówień z działu IT.
Oto, w jaki sposób grupy są przypisywane do działów
- IT - 1,2,5
- CALL CENTER - 4,6
- DRUKUJ - 3
Jakieś pomysły?
DODANY:
Stworzyłem coś takiego:
DECLARE @group INT;
SET @group = 1 --IT1
DECLARE @department VARCHAR(8);
SET @department = "IT"
SELECT * FROM orders WHERE
(@department IS NULL OR (@department="IT" AND group IN (1,2,5)) OR (@department="PRINT" AND group =3))
AND
(@group IS NULL OR group = @group)
Nie wiem czy to jest corrent, to jakoś działa :)
Odpowiedzi:
1 dla odpowiedzi № 1Możesz udawać, że masz tabelę, używając CTE wypełnionego rekordami za pośrednictwem union all. Następnie wykonaj połączenie i sprawdzenie. Jeśli wolisz, CTE może zostać zastąpione tabelą pochodną.
; WITH departments (DepartmentID, GroupID) as (
select "IT", 1
union all
select "IT", 2
union all
select "IT", 5
union all
select "CALL CENTRE", 4
union all
select "CALL CENTRE", 6
union all
select "PRINT", 3
)
SELECT *
FROM orders
INNER JOIN departments
ON orders.[group] = departments.GroupID
WHERE (@Group is null OR [group] = @group)
AND (@department is null OR DepartmentID = @department)
1 dla odpowiedzi nr 2
Oto zapytanie. W interfejsie, gdy wybrana jest jedna grupa, przypisujesz zmienną @group, tak jak wcześniej. Jeśli nie wybrano żadnej pojedynczej grupy, przypisujesz flagę dla działu. Więc jeśli wszystkie IT zostało wybrane, ustaw @allIT na 1 (lub cokolwiek, o ile nie ma wartości NULL) i postępuj w ten sposób:
SELECT * FROM orders
WHERE (@group = NULL OR group = @group)
AND
(@allIT = NULL OR group = 1 or group = 2 or group = 3)
AND
(@allCallCenter = NULL OR group = 4 or group = 5)
...
Jeśli w polu combobox nic nie jest zaznaczone, ustaw wartość tego parametru na NULL.