В запросе SQL отсутствуют строки - PullRequest
0 голосов
/ 15 мая 2018

Мне нужно иметь количество активов в SalesOrderLine, где SalesOrderLine.Shipped <> 'C'. Следующий SQL-запрос не извлекает никаких строк, если в SalesOrderLine нет ни одной строки или для всех этих строк SalesOrderLine.Shipped = 'C'. Подскажите, пожалуйста, где я здесь не прав?

Чтобы быть более конкретным:

  • Все столбцы имеют символьный тип данных (в основном nvarchar).
  • Если я удалю

    AND SalesOrderLine.Shipped <> ''C''
    

    из части WHERE, он получает несколько строк. Конечно, это не то, что мне нужно.

Вот пример одной SO с 140 активами, которая для всех, SalesOrderLine.Shipped = 'C':

Order No    Customer Name   Customer PO Asset Count SO Status   Released    Raised Date Order Type  Address Deliveries (Connotes)
O30540  ITPG Group  IAL4445, IAL3062    140 Cancelled   NO  11/01/2015  Sold    NYIAL5554, ITPL6032 NULL

Вот запрос:

('SELECT SalesOrderHeader.OrderNo AS [Order No], SalesOrderHeader.CustomerName AS [Customer Name], SalesOrderHeader.Reference1 AS [Customer PO], COUNT(SalesOrderLine.Barcode) AS [Asset Count], 
        LookUpData.CategoryLink AS [SO Status], (CASE WHEN isReleased = ''1'' THEN ''YES'' ELSE ''NO'' END) AS Released, SalesOrderHeader.RaisedDate AS [Raised Date], SalesOrderHeader.Ordertype AS [Order Type], 
        SalesOrderHeader.DeliverySuburb + SalesOrderHeader.DeliveryAddress1 AS [Address], (CASE WHEN LEN(pre_trimmed.DeliveryNo) < 1 THEN pre_trimmed.DeliveryNo ELSE LEFT(pre_trimmed.DeliveryNo , LEN(pre_trimmed.DeliveryNo)-1) END) AS [Deliveries (Connotes)]  
FROM SalesOrderHeader 
        INNER JOIN LookUpData ON SalesOrderHeader.Status = LookUpData.CategoryName 
        INNER JOIN SalesOrderLine ON SalesOrderHeader.OrderNo = SalesOrderLine.OrderNo 
        LEFT JOIN DeliveryHeader ON SalesOrderHeader.OrderNo = DeliveryHeader.OrderNo
CROSS APPLY
(
    SELECT DeliveryNo + '' ('' + Connote + ''), ''
    FROM DeliveryHeader AS intern
    WHERE DeliveryHeader.OrderNo = intern.OrderNo
    FOR XML PATH('''')
) pre_trimmed (DeliveryNo)
    WHERE 
        ' + @FieldName + ' Like ''%' + @FieldValue + '%'' 
        AND (LookUpData.Category = ''SOStatus'' AND SalesOrderLine.Shipped <> ''C'')  
    GROUP BY SalesOrderHeader.OrderNo , SalesOrderHeader.CustomerName, SalesOrderHeader.Reference1 , 
        LookUpData.CategoryLink, SalesOrderHeader.RaisedDate, SalesOrderHeader.Ordertype, 
        SalesOrderHeader.DeliverySuburb, SalesOrderHeader.DeliveryAddress1, pre_trimmed.DeliveryNo, SalesOrderHeader.isReleased 
        ORDER BY SalesOrderHeader.CustomerName, SalesOrderHeader.OrderNo')

1 Ответ

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

Я согласен со Шреком и Зоаром, что вы должны включить больше Информация. Это побудит кого-то помочь вам.

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

AND SalesOrderLine.Shipped <> ''C''

со следующей строкой

AND UPPER(LTRIM(RTRIM(SalesOrderLine.Shipped))) <> ''C''

Ниже приведено объяснение вашей удобной справки.

  • Исходя из упомянутых вами симптомов, похоже, что у вас могут быть нежелательные пробелы или проблема чувствительности к регистру.
  • Возможно, у вас есть тип данных столбца Shipped таблицы SalesOrderLine как VARCHAR вместо NVARCHAR. Поэтому я попытался LTRIM и RTRIM избавиться от любых пробелов вокруг. (PS - Вы можете TRIM, если он работает с вашей версией или даже просто RTRIM выполнит эту работу)
  • Также возможно, что у вас есть проблема с чувствительностью к регистру. Обычно сравнение строк не чувствительно к регистру. Тем не менее, вы можете иметь некоторые испорченные настройки.

@ mike - посмотрите, поможет ли это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...