0

基本的に、この例のようなテーブル「Songs」があります。

ここに画像の説明を入力してください

データを取得してグリッドビューに表示する必要があります。テーブルは散らかっていて、曲は任意の順序にすることができますが、必ずしもアルバムや歌手ごとにグループ化する必要はありません。最初に行を歌手で並べ替える必要があります。アーティストをアルファベット順に並べ替える必要があります。アルバムもグループ化する必要があります。しかし、もっと重要なことは、曲をアルファベット順または番号順に並べ替える必要があるということです。

上の表は、私が望む理想的なソート済みリストを示しています。このためのT-SQLの書き方を誰かに教えてもらえますか。SQL Server2008R2を使用しています。

4

3 に答える 3

1

アルバムの曲をアルファベット順に並べる(IMHOではない可能性が高い)か、番号で並べ替える(おそらく、狂気を本来の意図以外の順序で聴きたくないので、はるかに多い)かを選択する必要があります。 )。上記のコメントでほのめかしたように、両方を行うことはできません。

番号で並べ替えるには:

SELECT Title, Singer, Album
  FROM dbo.Songs
  ORDER BY Singer, Album, 
    CONVERT(INT, SUBSTRING(Title, 1, CHARINDEX('.', Title)));

タイトルをアルファベット順に並べ替えるには:

SELECT Title, Singer, Album
  FROM dbo.Songs
  ORDER BY Singer, Album, 
    SUBSTRING(Title, CHARINDEX('.', Title) + 1, 255); 
    -- 255 or whatever the column is defined as

多くの人が提案しますLEN(Title)が、私にはそれは不要な計算です。それが正当化される唯一のケースであるIMHOは、スキーマが急速に進化していて、その列の最大長が「安定している」と見なされなかった場合です。そのような場合でも、その列の将来のサイズの増加に対応できる可能性が高い、より大きな数値を使用することをお勧めします4000

@ a1ex07が示唆しているように、番号とタイトルを別々に保存することを検討する必要があります。これは次のように実行できます。

ALTER TABLE dbo.Songs ADD SongNumber TINYINT;
ALTER TABLE dbo.Songs ADD SongTitle VARCHAR(255);

UPDATE dbo.Songs SET 
  SongNumber = CONVERT(TINYINT, SUBSTRING(Title, 1, CHARINDEX('.', Title))),
  SongTitle  = SUBSTRING(Title, CHARINDEX('.', Title) + 1, 255);

-- once you've verified:    
ALTER TABLE dbo.Songs DROP COLUMN Title;

また、このテーブルにアクセスするすべてのプロセスを更新する必要があります(または、ビューを作成して、それらをビューにポイントします)。SongNumberこれで、またはで並べ替える場合SongTitleは、ORDER BY句がはるかに簡単になります。(ただし、それでも両方で並べ替えることはできません。考えてみると、非常に理にかなっています。)

于 2012-04-21T17:38:56.797 に答える
1
select  *
from    Songs
order by
        Singer
,       Album
,       Title
于 2012-04-21T14:38:15.150 に答える
0

並べ替えの唯一の問題Singer, Album,Titleは、タイトルに数字と文字列が含まれていることです (これは 1NF を破るので良くありません)。フォーマットについて絶対に確信がある場合はtitle、次のことができます

ORDER BY Singer, Album,
cast(substring(Title,0,CHARINDEX( '.',Title)) as int),
substring(Title,CHARINDEX( '.',Title)+1,LEN(Title))
-- LEN(Title) should work, even though it would be more correct to put the right number of
-- characters (from position of '.' to the end)
于 2012-04-21T14:59:15.117 に答える