2016-02-08 1 views
0

Мне нужно получить подстроку из столбца «источник» из typeTable и иметь возможность получать статистику по каждому региону из этого столбца. Строка будет выглядеть примерно так: server001 [en-US]. Затем распечатайте статистику для каждой страны. То есть мне нужна countForType и totalForType для каждой страны.SQL Server: групповой запрос на основе подстроки столбца

Итак, я считаю, что все вызовы server001 и группировать их по странам - это то, что я ищу.

Мой запрос, до сих пор выглядит следующим образом:

 use thedatabase; 

     declare @fromDate datetime = '2016-02-01 00:00:00.000'; 
     declare @toDate datetime = '2016-02-02 23:59:59.999'; 
     declare @source varchar(15) = 'server001'; 

     DECLARE @countForType bigint; 
     DECLARE @totalForType decimal(30,8); 

     DECLARE @country varchar(10); 

     SELECT @countForType = count(*), 
       @totalForType = SUM(typeTable.amount), 
       @country = 
        case 
        when (charindex('[', typeTable.source) > 0 and charindex(']', typeTable.source) > 0) 
        then substring(typeTable.source, charindex('[', typeTable.source) +1, (charindex(']', typeTable.source) - 1) - charindex('[', typeTable.source)) 
        else null 
        end 

     FROM theTypeTable typeTable (nolock) 
     WHERE typeTable.startDate > @fromDate 
     AND typeTable.startDate < @toDate 
     AND typeTable.source like @source 
     GROUP BY typeTable.source; -- i believe the issue may be here -- source is the entire string 'server001[en-US]'. I need to group and provide stats per country, which is a substring of source. 


    --Print report: 
    PRINT 'countForType: ' + CAST(@countForType AS VARCHAR); 
    PRINT 'totalForType: ' + CAST(@totalForType AS VARCHAR); 
    --for each country, print the amounts/ percentages etc... 
    PRINT 'country: ' + CAST (@country AS VARCHAR); 

Отчет сам по себе будет выглядеть примерно так:

countForType: 104 
totalForType: 110000.00000000 

country: en-US 
countForType: 55 
totalForType: 95000.00000000 

country: de-CH 
countForType: 25 
totalForType: 5000.00000000 

country: tr-TR 
countForType: 30 
totalForType: 10000.00000000 

Может кто-то дайте мне знать, если я нахожусь на правильном пути здесь, или если это должно быть полностью переписано? Любые указатели оцениваются.

+0

Это простой вопрос программирования, пожалуйста, google и узнайте о функции SUBSTRING в SQL Server. –

+0

Я знаю, как использовать подстроку. Пожалуйста, прочитайте сообщение полностью. – Matt

+0

Я полностью прочитал сообщение. Поскольку вы уже указали информацию о предложении GROUP BY, я предположил, что вы не знаете, как получить подстроку. Можете ли вы более четко указать, какую часть этого вопроса вы не знаете, как это сделать? –

ответ

2

У вас уже есть код. GROUP BY заявление СЛУЧАЯ вы использовали, чтобы получить страна:

GROUP BY      case 
        when (charindex('[', typeTable.source) > 0 and charindex(']', typeTable.source) > 0) 
        then substring(typeTable.source, charindex('[', typeTable.source) +1, (charindex(']', typeTable.source) - 1) - charindex('[', typeTable.source)) 
        else null 
        end 

И, кстати, ваш код не будет делать то, что ваши комментарии, что вы хотите это сделать:

--Print report: 
PRINT 'countForType: ' + CAST(@countForType AS VARCHAR); 
PRINT 'totalForType: ' + CAST(@totalForType AS VARCHAR); 
--for each country, print the amounts/ percentages etc... 
PRINT 'country: ' + CAST (@country AS VARCHAR); 

Вы хранения данных скалярные переменные, что означает, что выполнение вашего запроса будет хранить только одно значение в каждой из переменных. Это не позволит вам перебирать каждый результат. Чтобы получить результат в точном формате, указанном в вашем вопросе, вам нужно будет использовать либо цикл WHILE, либо CURSOR.

Однако я сомневаюсь, действительно ли вам нужен SQL для вывода этого формата. Было бы лучше, если бы SQL возвращал результирующий набор и форматировал вывод в вашем лицевом приложении.

+0

Будет ли работать «GROUP BY @ country»? Я просто спрашиваю, потому что я не знаю, обработал бы SQL Server! –

+0

Нет. Вы не можете группировать переменную. –

+0

Отлично, спасибо за информацию, я знал, что вы не можете с псевдонимом. –

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