基本上我有一个像这个例子的表“歌曲”。
我需要获取数据并在gridview中显示。桌子很乱,歌曲可以按任何顺序排列,不一定按专辑或歌手分组。我需要先按歌手对行进行排序,它应按字母顺序对艺术家进行排序。专辑也应该分组。但更重要的是,歌曲应按字母顺序/或按数字顺序排序。
上表显示了我想要的理想排序列表。任何人都可以指出如何为此编写T-SQL。我正在使用SQL Server 2008 R2。
答案 0 :(得分:1)
select *
from Songs
order by
Singer
, Album
, Title
答案 1 :(得分:1)
您需要选择是否要按字母顺序排列相册中的歌曲(不太可能是恕我直言)或按数字排序(更有可能,因为我不希望以任何顺序收听月球的黑暗面初衷)。正如我在上面的评论中提到的那样,你不能同时做到这两点。
按编号排序:
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)
,但对我而言,这是一项不必要的计算。恕我直言的唯一理由是,模式正在快速发展,并且该列的最大长度不能被认为是“稳定的”。在这些情况下,我可能仍然建议使用更高的数字,这可能适应该列的任何未来大小增加,例如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
子句要简单得多。 (但是你仍然无法按两者进行排序,如果你考虑它就会很有意义。)
答案 2 :(得分: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)