在string_agg中排序似乎无效

时间:2018-08-06 09:43:56

标签: sql sql-server sql-server-2017

我有一个#tmp表,如下所示:

ivSwitch.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(gridShowing) {
                gridShowing=false;
                recyclerView.setLayoutManager(new LinearLayoutManager(ResultsActivity.this));

                ivSwitch.setImageResource(R.drawable.ic_grid);
            }

            else {
                gridShowing=true;
                recyclerView.setLayoutManager(new GridLayoutManager(ResultsActivity.this, 2));
                ivSwitch.setImageResource(R.drawable.ic_list);
            }

        }
    });

我想根据line_no的升序来合并DefaultDimension和DefaultDimensionName列

这是我写的查询,但没有按顺序得到它:

recid       DefaultDimension    DefaultDimensionName    line_no
5637423499  Default             Employee                7
5637423499  1001                Product                 8
5637423499  100                 Region                  2
5637423499  1                   Routing                 17
5637423499  115                 Section                 5
5637423499  999                 Unit                    6
5637423499  1510                Branch                  3
5637423499  A                   CabinClass              14
5637423499  0B                  Carrier_Property        9
5637423499  103                 Channel                 16
5637423499  104                 Department              4
5637423499  113                 Division_CustomerType   1

结果:

select recid, 
STRING_AGG(DefaultDimension, '-')  WITHIN GROUP (ORDER BY line_no ASC) DefaultDimension,
STRING_AGG(DefaultDimensionName, '-') WITHIN GROUP (ORDER BY line_no ASC) DefaultDimensionName 
from #tmp
group by recid

您可以看到CabinClass应该排在倒数第3位,但是排在第2位。

2 个答案:

答案 0 :(得分:4)

您通常会注意到,您的line_novarchar

  

'1'<'14'<'16 <'17'<'2'

因此,只需将varchar解析为int即可解决问题。

select recid, 
STRING_AGG(DefaultDimension, '-')  WITHIN GROUP (ORDER BY CAST(line_no AS int) ASC) DefaultDimension,
STRING_AGG(DefaultDimensionName, '-') WITHIN GROUP (ORDER BY CAST(line_no AS int)ASC) DefaultDimensionName 
from #tmp
group by recid

答案 1 :(得分:1)

由于您的line_no似乎是varchar,请先将其强制转换为INT:

select recid, 
       STRING_AGG(DefaultDimension, '-')  WITHIN GROUP (ORDER BY cast(line_no as INT) ASC) DefaultDimension,
       STRING_AGG(DefaultDimensionName, '-') WITHIN GROUP (ORDER BY cast(line_no as INT) ASC) DefaultDimensionName 
from #tmp
group by recid