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

#tsql

#tsql

Вопрос:

У меня есть запрос, который проверяет уровни запасов. Мне нужно отфильтровать элементы на основе переменной CustomerID, указанной в программном обеспечении. Между элементами и клиентами нет прямого соединения. Однако у меня есть пользовательские поля в клиентах, которые определяют, какие группы товаров им разрешено покупать (логическое значение). У меня также есть настраиваемое поле в элементе, которое определяет, к какой группе оно принадлежит (строка).

Я попытался использовать перекрестное соединение, но, как вы можете видеть, я получил пустые элементы и данные справа, чего я не хотел. У меня нет остальной части запроса (проверка запасов), на данный момент я пытаюсь получить товары для показа Клиенту на основе групп. Я заменил фактические поля на Group1, Group2 и т.д. Пожалуйста, не обращайте внимания на скобки.

 SELECT Customers.CustomerNo,
       Customers.CustomerID,
       Customers.Name,
       CASE
           WHEN Customers.[Group1] = 1
                AND Items.UserDefined1 = 'Group1'
           THEN Items.ItemNo
           WHEN Customers.Group2 = 1
                AND Items.UserDefined1 = 'Group2'
           THEN Items.ItemNo
           WHEN Customers.[Group3] = 1
                AND Items.UserDefined1 = 'Group3'
           THEN Items.ItemNo
           WHEN Customers.[Group4] = 1
                AND Items.UserDefined1 = 'Group4'
           THEN Items.ItemNo
           WHEN Customers.Group5 = 1
                AND Items.UserDefined1 = 'Group5'
           THEN Items.ItemNo
           WHEN Customers.[Group6] = 1
                AND Items.UserDefined1 = 'Group6'
           THEN Items.ItemNo
           WHEN Customers.[Group7] = 1
                AND Items.UserDefined1 = 'Group7'
           THEN Items.ItemNo
           WHEN Customers.[Group8] = 1
                AND Items.UserDefined1 = 'Group8'
           THEN Items.ItemNo
           WHEN Customers.[Group9] = 1
                AND Items.UserDefined1 = 'Group9'
           THEN Items.ItemNo
           WHEN Customers.Group10 = 1
                AND Items.UserDefined1 = 'Group10'
           THEN Items.ItemNo
           WHEN Customers.Group11 = 1
                AND Items.UserDefined1 = 'Group11'
           THEN Items.ItemNo
           ELSE ''
       END AS ItemNo,
       Items.Name AS Description,
       Items.UserDefined1
FROM
(
    SELECT Items_1.ItemNo,
           Items_1.Name,
           ItemsUserDefined.UserDefined1
    FROM dbo.Items AS Items_1
         INNER JOIN
(
    SELECT UserDefined1,
           OwnerID
    FROM dbo.AdditionalInfo
    WHERE(ModuleID = 12)
) AS ItemsUserDefined ON Items_1.ItemID = ItemsUserDefined.OwnerID
) AS Items
CROSS JOIN
(
    SELECT Customers_1.CustomerNo,
           Customers_1.Name,
           Customers_1.CustomerID,
           CustomerUserDefined.[Group1],
           CustomerUserDefined.Group2,
           CustomerUserDefined.[Group3],
           CustomerUserDefined.[Group4],
           CustomerUserDefined.Group5,
           CustomerUserDefined.[Group6],
           CustomerUserDefined.[Group7],
           CustomerUserDefined.[Group8],
           CustomerUserDefined.[Group9],
           CustomerUserDefined.Group10,
           CustomerUserDefined.Group11
    FROM dbo.Customers AS Customers_1
         INNER JOIN
(
    SELECT UserDefined9 AS [Group1],
           UserDefined10 AS Group2,
           UserDefined11 AS [Group3],
           UserDefined12 AS [Group4],
           UserDefined13 AS Group5,
           UserDefined14 AS [Group6],
           UserDefined15 AS [Group7],
           UserDefined16 AS [Group8],
           UserDefined17 AS [Group9],
           UserDefined18 AS Group10,
           UserDefined20 AS Group11,
           OwnerID
    FROM dbo.AdditionalInfo AS AdditionalInfo_1
    WHERE(ModuleID = 38)
) AS CustomerUserDefined ON Customers_1.CustomerID = CustomerUserDefined.OwnerID
) AS Customers
WHERE CustomerID = 472
  

Ответ №1:

Я присоединился к таблице customer и items, используя оператор case, поскольку между этими двумя таблицами нет прямой связи.

Запрос

 select items.name,customers.customerID, items.userdefined1
from customers
inner join Items on items.userdefined1 = (case when customers.group1 =1 then 'group1' 
                                               when customers.group2 =1 then 'group2' 
                                               when customers.group3 =1 then 'group3' 
                                               when customers.group4 =1 then 'group4' 
                                               when customers.group5 =1 then 'group5' 
                                          end )
  

Вывод

введите описание изображения здесь

Комментарии:

1. Мне потребовалась минута, чтобы понять, куда это вписать, но я понял это. Спасибо!

2. Ну, оператор case неверен, он прекращает синтаксический анализ после того, как находит первое совпадение.

3. можете ли вы поделиться своим запросом?

4. см. Измененный запрос

Ответ №2:

Таким образом, SQL прекратит синтаксический анализ, когда найдет первое значение ‘TRUE’ выражения. Мне нужно, чтобы он возвращал ВСЕ значения true.

 SELECT CustomerNo,
       CustomerID,
       Items.ItemNo,
       Items.Name AS Description
FROM
(
    SELECT Customers_1.CustomerNo,
           Customers_1.Name,
           Customers_1.CustomerID,
           CustomerUserDefined.[Group1],
           CustomerUserDefined.Group2,
           CustomerUserDefined.[Group3],
           CustomerUserDefined.[Group4],
           CustomerUserDefined.Group5,
           CustomerUserDefined.[Group6],
           CustomerUserDefined.[Group7],
           CustomerUserDefined.[Group8],
           CustomerUserDefined.[Group9],
           CustomerUserDefined.Group10,
           CustomerUserDefined.Group11
    FROM dbo.Customers AS Customers_1
         INNER JOIN
(
    SELECT UserDefined9 AS [Group1],
           UserDefined10 AS Group2,
           UserDefined11 AS [Group3],
           UserDefined12 AS [Group4],
           UserDefined13 AS Group5,
           UserDefined14 AS [Group6],
           UserDefined15 AS [Group7],
           UserDefined16 AS [Group8],
           UserDefined17 AS [Group9],
           UserDefined18 AS Group10,
           UserDefined20 AS Group11,
           OwnerID
    FROM dbo.AdditionalInfo AS AdditionalInfo_1
    WHERE(ModuleID = 38)
) AS CustomerUserDefined ON Customers_1.CustomerID = CustomerUserDefined.OwnerID
) AS Customers
INNER JOIN
(
    SELECT Items_1.ItemNo,
           Items_1.Name,
           ItemsUserDefined.UserDefined1
    FROM dbo.Items AS Items_1
         INNER JOIN
(
    SELECT UserDefined1,
           OwnerID
    FROM dbo.AdditionalInfo
    WHERE(ModuleID = 12)
) AS ItemsUserDefined ON Items_1.ItemID = ItemsUserDefined.OwnerID
) AS Items ON Items.UserDefined1 = (CASE
                                        WHEN Customers.[Group1] = 1
                                        THEN 'Group1'
                                        WHEN Customers.Group2 = 1
                                        THEN 'Group2'
                                        WHEN Customers.[Group3] = 1
                                        THEN 'Group3'
                                        WHEN Customers.[Group4] = 1
                                        THEN 'Group4'
                                        WHEN Customers.Group5 = 1
                                        THEN 'Group5'
                                        WHEN Customers.[Group6] = 1
                                        THEN 'Group6'
                                        WHEN Customers.[Group7] = 1
                                        THEN 'Group7'
                                        WHEN Customers.[Group8] = 1
                                        THEN 'Group8'
                                        WHEN Customers.[Group9] = 1
                                        THEN 'Group9'
                                        WHEN Customers.Group10 = 1
                                        THEN 'Group10'
                                        WHEN Customers.Group11 = 1
                                        THEN 'Group11'
                                    END)
WHERE CustomerID = 578;
  

Ответ №3:

В приведенном ниже примере у клиента 124 есть две истинные записи для group3. Оператор Case возвращает обе записи.

     select items.name,customers.customerID, items.userdefined1
from customers
inner join Items on items.userdefined1 = (case when customers.group1 =1 then 'group1' 
                                               when customers.group2 =1 then 'group2' 
                                               when customers.group3 =1 then 'group3' 
                                               when customers.group4 =1 then 'group4' 
                                               when customers.group5 =1 then 'group5' 
                                          end )
  

введите описание изображения здесь

Я изменил приведенный ниже запрос. Вместо прямого использования оператора case я использовал его как подзапрос для выборки Items.UserDefined1 . Не удалось выполнить запрос, поскольку у меня нет таблицы AdditionalInfo .

Попробуйте это,

 SELECT CustomerNo,
       CustomerID,
       Items.ItemNo,
       Items.Name AS Description
FROM
(
    SELECT Customers_1.CustomerNo,
           Customers_1.Name,
           Customers_1.CustomerID,
           CustomerUserDefined.[Group1],
           CustomerUserDefined.Group2,
           CustomerUserDefined.[Group3],
           CustomerUserDefined.[Group4],
           CustomerUserDefined.Group5,
           CustomerUserDefined.[Group6],
           CustomerUserDefined.[Group7],
           CustomerUserDefined.[Group8],
           CustomerUserDefined.[Group9],
           CustomerUserDefined.Group10,
           CustomerUserDefined.Group11
    FROM dbo.Customers AS Customers_1
         INNER JOIN
(
    SELECT UserDefined9 AS [Group1],
           UserDefined10 AS Group2,
           UserDefined11 AS [Group3],
           UserDefined12 AS [Group4],
           UserDefined13 AS Group5,
           UserDefined14 AS [Group6],
           UserDefined15 AS [Group7],
           UserDefined16 AS [Group8],
           UserDefined17 AS [Group9],
           UserDefined18 AS Group10,
           UserDefined20 AS Group11,
           OwnerID
    FROM dbo.AdditionalInfo AS AdditionalInfo_1
    WHERE(ModuleID = 38)
) AS CustomerUserDefined ON Customers_1.CustomerID = CustomerUserDefined.OwnerID
) AS Customers
INNER JOIN
(
    SELECT Items_1.ItemNo,
           Items_1.Name,
           ItemsUserDefined.UserDefined1
    FROM dbo.Items AS Items_1
         INNER JOIN
(
    SELECT UserDefined1,
           OwnerID
    FROM dbo.AdditionalInfo
    WHERE(ModuleID = 12)
) AS ItemsUserDefined ON Items_1.ItemID = ItemsUserDefined.OwnerID
) AS Items ON Items.UserDefined1 in(select items.userdefined1
                                    from customers
                                    inner join Items on items.userdefined1 = (case when customers.group1 =1 then 'group1' 
                                                                                   when customers.group2 =1 then 'group2' 
                                                                                   when customers.group3 =1 then 'group3' 
                                                                                   when customers.group4 =1 then 'group4' 
                                                                                   when customers.group5 =1 then 'group5' 
                                                                             end ))
WHERE CustomerID = 578;