1

アルファベット順ではなく、月または順序に基づいて行を並べ替える必要があります。

以下のクエリを実行すると、次の結果が得られます

Col Mon Tue Wed Thu Fri
--- --- --- --- --- ---
Feb 1   2   3   4   5
Jan 2   3   4   5   6 
Mar 3   4   5   6   7

次のように注文するにはどうすればよいですか。

Col Mon Tue Wed Thu Fri
--- --- --- --- --- ---
Jan 2   3   4   5   6 
Feb 1   2   3   4   5
Mar 3   4   5   6   7

私のクエリ:

select *
from
(
  select LEFT(datename(dw,datetime),3) as DateWeek,
    col, 
    value
  from DataTable
  cross apply 
  (
    values ('Jan', JData), ('Feb', FData),  ('Mar', MData)
  ) c (col, value)
) src
pivot
(
  sum(value)
  for dateweek in (Mon, Tue, Wed, Thu, Fri)
) piv

現時点では、値の行を次のように置き換えています。

values ('1.Jan', JData), ('2.Feb', FData),  ('3.Mar', MData)

もっと良い解決策があると思います

4

2 に答える 2

1

これを試して:

select * from DataTable
order by convert(datetime, '2012/'+ Col +'/01') 

SQLフィドル

于 2013-03-09T15:50:23.797 に答える
0

Wawrzyniec Sz. に感謝します。解決策を見つけました。追加の列を追加すると、うまくいきます。

数か月間、コードは次のようになります。

select col, Mon, Tue, Wed, Thu, Fri
from
(
  select LEFT(datename(dw,datetime),3) as DateWeek, 
    ord,
    col, 
    value
  from DataTable
  cross apply 
  (
    values ('1','Jan', AVol_Offered), ('2','Feb', OVol_Offered),  ('3','Mar', AAHT)
  ) c (ord, col, value)
) src
pivot
(
  sum(value)
  for dateweek in (Mon, Tue, Wed, Thu, Fri)
) piv
order by ord

これは他の値にも当てはまります。たとえば、C、A、B としてリストされている順序を維持したい場合 (asc または des で注文することはできません)、次のように同じコードを使用することもできます。

select col, Mon, Tue, Wed, Thu, Fri
from
(
  select LEFT(datename(dw,datetime),3) as DateWeek, 
    ord,
    col, 
    value
  from DataTable
  cross apply 
  (
    values ('1','C', AVol_Offered), ('2','A', OVol_Offered),  ('3','B', AAHT)
  ) c (ord, col, value)
) src
pivot
(
  sum(value)
  for dateweek in (Mon, Tue, Wed, Thu, Fri)
) piv
order by ord

ヘルプ/ヒントをありがとう

于 2013-03-09T16:55:40.940 に答える