Как обработать порядок полей в групповой строке на основе выбора пользователя? - PullRequest
0 голосов
/ 27 июня 2018

У меня такой запрос в Sql Server 2008:

Select ColumnA, ColumnB, ColumnC, ColumnD, sum(value1), sum(value2), sum(value3)...
from Table
group by ColumnA, ColumnB, ColumnC, ColumnD

Что мне нужно сделать, это изменить порядок столбцов в строке GroupBy в соответствии с требованиями пользователя. Например, Пользователь1 хочет видеть результаты: group by ColumnB, ColumnA, ColumnD, ColumnC, где Пользователь2 хочет видеть результаты: group by ColumnD, ColumnA, ColumnC, ColumnB. По сути, порядок в сегменте groupby должен быть динамическим в зависимости от выбора пользователя. Есть 24 потенциальных заказа ...

Как лучше всего с этим справиться?

Я пришел с такой идеей:

declare @groupbyOrder int = 20 --let's say 20
Select ColumnA, ColumnB, ColumnC, ColumnD, sum(value1), sum(value2), sum(value3)...
from Table
group by (case when @groupbyOrder = 1 then ColumnA, ColumnB, ColumnC, ColumnD)
               ...
               when @groupbyOrder = 20 then ColumnD, ColumnB, ColumnC, ColumnA)
               ...)

Но это не сработало, и я не думаю, что это хороший способ решить проблему. Любой совет будет оценен.

Ответы [ 3 ]

0 голосов
/ 27 июня 2018

А? group by не нужно менять, только select. Порядок выражений в group by не влияет на то, как выглядит результирующий набор.

Это очень странный запрос, но я думаю, что четыре переменные имеют больше смысла, чем 1:

Select (case when @firstColumn = 'A' then ColumnA
             when @firstColumn = 'B' then ColumnB
             . . .
        end) as firstcolumn,
       (case when @secondColumn = 'A' then ColumnA
             when @secondCOlumn = 'B' then ColumnB
             . . .
        end) as secondcolumn,
       . . .
       sum(value1), sum(value2), sum(value3)...
from Table t
group by ColumnA, ColumnB, ColumnC, ColumnD;

Я предполагаю, что вы действительно заботитесь о order by - group by строках в произвольном порядке. Если это так, вам следует задать еще один вопрос с образцами данных и объяснением того, что вам нужно.

0 голосов
/ 27 июня 2018

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

* ** 1003 тысяча два * Пример
Declare @Cols varchar(max)
Declare @GroupOrder varchar(max)
Declare @SQL varchar(max)

Select @Cols = Cols
      ,@GroupOrder = isnull(GroupOrder,Cols)
 From  (values (1,'ColA,ColB',null)                                          -- Notice GrpBy is null
              ,(2,'ColA,ColB=cast(ColB as date)','ColA,cast(ColB as date)')  -- can include expressions
               -- Add more otions here
       ) A(ID,Cols,GroupOrder)
  Where ID=2

Set @SQL = '
Select '+@Cols +',sum(value1),sum(value)
 From  Table
 Group By '+@GroupOrder +'
 Order By '+@GroupOrder

Print @SQL
--Exec(@SQL)

Сгенерированный SQL

Select ColA,ColB=cast(ColB as date),sum(value1),sum(value)
 From  Table
 Group By ColA,cast(ColB as date)
 Order By ColA,cast(ColB as date)
0 голосов
/ 27 июня 2018

Расширяя комментарий Гродона, вы можете использовать динамический sql для построения оператора sql с использованием выбранного предпочтения пользователя.

Получить предпочтительный порядок пользователя в виде строки, например

'group by Column1,Column2'

Затем добавьте это к вашему статическому тексту запроса,

'Select ColumnA, ColumnB, ColumnC, ColumnD, sum(value1), sum(value2), sum(value3) from Table'

и выполнить окончательный оператор:

'Select ColumnA, ColumnB, ColumnC, ColumnD, sum(value1), sum(value2), sum(value3) from Table' + 'group by Column1,Column2'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...