1

我有一个包含两个字符串列的表:NameCode. Code是唯一的,但Name不是。样本数据:

Name      Code
--------  ----
Jacket    15
Jeans     003
Jeans     26

我想选择具有最小值的唯一行Code,但不是数值;而是字符串的长度。当然这不起作用:

SELECT Name, Min(Code) as Code
FROM Clothes
GROUP BY Name, Code

上面的代码将为牛仔裤返回一行,如下所示:

Jeans | 003

这是正确的,因为作为一个数字,003小于26。但不是在我的应用程序中,它关心值的长度,而不是实际值。长度为三个字符的值大于长度为两个字符的值。我实际上需要它来返回这个:

Jeans | 26

因为 的长度26的长度003

那么如何编写 SQL 代码来选择具有最小长度而不是实际最小值的代码的行?我试过这样做:

SELECT Name, Min(Len(Code)) as Code
FROM Clothes
GROUP BY Name, Code

上面只返回一个字符,所以我最终得到了这个:

Jeans | 2
4

3 回答 3

4
;WITH cte AS
(
  SELECT Name, Code, rn = ROW_NUMBER()
    OVER (PARTITION BY Name ORDER BY LEN(Code))
    FROM dbo.Clothes
)
SELECT Name, Code
FROM cte
WHERE rn = 1;

SQLfiddle 演示

如果您有多个共享相同长度的代码值,则选择将是任意的,因此您可以通过添加额外的 order by 子句来打破平局,例如

OVER (PARTITION BY Name ORDER BY LEN(Code), CONVERT(INT, Code) DESC)

SQLfiddle 演示

于 2013-08-02T14:50:43.440 回答
1

尝试这个

select clothes.name, MIN(code)
from clothes
    inner join
    (
        SELECT 
            Name, Min(Len(Code)) as CodeLen
        FROM
            clothes 
        GROUP BY
        Name
    ) results
on clothes.name = results.name
and LEN(clothes.code) = results.CodeLen
group by clothes.name
于 2013-08-02T14:50:10.130 回答
0

听起来您正在尝试对 Code 字段的数值进行排序。如果是这样,正确的方法是先将其转换为 INT,然后将其用于排序/最小函数(在子查询中),然后在主查询子句中选择原始代码。

于 2013-08-02T14:35:44.287 回答