在SELECT语句SQL Server中定义varchar字符的限制

时间:2016-01-30 02:21:30

标签: sql sql-server datetime

有点奇怪的问题。我正在查询保存文章的数据库。所有文章都有一个与它们相关的季节,因此它们可以在DB中出现不止一次的不同季节。当我选择文章& MAX季节,我没有得到正确的结果,让我相信逻辑没有到位,无法定义哪个季节是最近的等等(我只读过这个DB的访问权限)。例如,当选择一篇文章和MAX季节时,我得到的结果是,在实际检查源系统时,最大季节是SS2016,最大季节是FW16(春/夏,秋/冬)。但是,如果我使用MIN函数,则季节显示为FW16,这对于max是正确的,但是F在字母表中的S之前使我相信没有涉及日期时间逻辑...在SELECT语句中是否有任何方式,告诉查询SS始终小于FW。它总是SS或FF,然后是四位数年份,即FW2016& S2016。

查询如下:

SELECT ARTICLE_NUMBER,
       MAX(SEASON)

FROM   vw_GIM_Articles

WHERE  ARTICLE_NUMBER = 'Q10176'

GROUP BY ARTICLE_NUMBER;

SELECT ARTICLE_NUMBER,
       MIN(SEASON)

FROM   vw_GIM_Articles

WHERE  ARTICLE_NUMBER = 'Q10176'

GROUP BY ARTICLE_NUMBER;

结果是(按照上面的查询顺序):

ARTICLE_NUMBER     
------------------ -------
Q10176             SS2016

(1 row(s) affected)

ARTICLE_NUMBER     
------------------ -------
Q10176             FW2016

(1 row(s) affected)

1 个答案:

答案 0 :(得分:1)

[SQL Fiddle Demo]

SELECT TOP 1 ARTICLE_NUMBER,Season, SUBSTRING( SEASON,3,50)
FROM   vw_GIM_Articles
WHERE  ARTICLE_NUMBER = 'Q10176'
ORDER BY CONVERT( int, SUBSTRING( SEASON,3,50)) DESC ,
    cast(CASE WHEN Season LIKE 'FW%' THEN 1 ELSE 0 END AS bit)  desc 

如果您想选择文章列表

试试这个,[SQL Fiddel Demo]

;WITH grouped AS
(
   SELECT *,
         ROW_NUMBER() OVER (PARTITION BY ARTICLE_NUMBER 
                            ORDER BY CONVERT( int, SUBSTRING( SEASON,3,50)) DESC ,
                            cast(CASE WHEN Season LIKE 'FW%' THEN 1 ELSE 0 END AS bit)  desc ) AS rn
   FROM vw_GIM_Articles
)
SELECT *
FROM grouped
WHERE rn = 1