2015-08-31 1 views
0

Я запускаю запрос на продажу, где может быть несколько номеров заказов за транзакцию. Если это так, я хотел бы, чтобы запрос возвращал слово «Multiple» в столбце, и если он имеет только один порядок, верните порядок #.SQL Server для возврата текста, если есть транзакции с несколькими значениями

SELECT Distinct TOP 10000 [Store Number] 
    ,[Store Name] 
    ,[Register Sales Posting Date] 
    ,[Transaction Date] 
    ,[Register ID] 
    ,[Transaction ID] 
    ,[Net Sales] 
    ,[Tax Exempt Sales] 
    ,[Markdown] 
    ,[Tax Amount] 
    ,[Gross Sales] 
    ,[Tax Exempt ID] 
    ,CASE 
    WHEN COUNT([Customer Order Number])>'1' THEN 'Multiple' 
    ELSE[Customer Order Number] 
    END 
FROM [PropertyTax].[dbo].[SQLAExport] 
WHERE [Store Number] = '4920' 
    AND [Transaction Date] = '1/14/2011' 
GROUP BY 
     [Store Number] 
     ,[Store Name] 
     ,[Register Sales Posting Date] 
     ,[Transaction Date] 
     ,[Register ID] 
     ,[Transaction ID] 
     ,[Net Sales] 
     ,[Tax Exempt Sales] 
     ,[Markdown] 
     ,[Tax Amount] 
     ,[Gross Sales] 
     ,[Tax Exempt ID] 
     ,[Customer Order Number] 
+0

Какую версию SQL-сервера вы используете? –

+0

Удалите футляр и оставьте счет. Затем заверните весь свой sql с помощью select, а затем используйте CASE на CustomerOrderNumberCount. –

ответ

3

Если вы используете SQL Server 2012+, вы можете использовать count() over (partition by ...). Если на более низкой версии вы можете получить количество заказов на транзакцию (или, например, w/e, вы разбиваете на разделы), например, с помощью cross apply (см. Этот код SQL Fiddle для примеров обоих методов).

Попробуйте удалить группу и изменить выражение case, чтобы вместо этого использовать подсчет окон (в этом запросе я предположил, что [Идентификатор транзакции] - это то, что нужно разделить на (указывающее группу), если это не возможно изменить его).

Может быть, это то, что вы ищете:

SELECT TOP 10000 
    [Store Number] 
    ,[Store Name] 
    ,[Register Sales Posting Date] 
    ,[Transaction Date] 
    ,[Register ID] 
    ,[Transaction ID] 
    ,[Net Sales] 
    ,[Tax Exempt Sales] 
    ,[Markdown] 
    ,[Tax Amount] 
    ,[Gross Sales] 
    ,[Tax Exempt ID] 
    , CASE WHEN COUNT([Customer Order Number]) OVER (PARTITION BY [Transaction ID]) > 1 
     THEN 'Multiple' 
     ELSE [Customer Order Number] 
    END -- if [Customer Order Number] is a number and not a char you need to cast it 
FROM [PropertyTax].[dbo].[SQLAExport] 
WHERE [Store Number] = '4920' 
    AND [Transaction Date] = '1/14/2011' 

Кроме того, известно, что с помощью top n без order by пункта не даст вам детерминированный результата, а скорее случайный выбор n строк (которые могут кажутся заказанными, но не гарантируется). Всегда используйте order by, когда используете top.

+0

Он отлично работал. Я предполагаю, что я все еще могу добавить SELECT DISTINCT для возврата в строке для каждого идентификатора транс. –

+0

@ JaredHilburn Да, добавление 'distinct' не имеет значения. – jpw

Смежные вопросы