1

と の 2 つの文字列列を持つテーブルがありNameますCodeCodeはユニークですが、Nameそうではありません。サンプルデータ:

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

最小値を持つ一意の行を選択したいのですがCode、数値ではありません。むしろ、文字列の長さです。もちろん、これは機能しません:

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

上記のコードは、次のようなジーンズの 1 つの行を返します。

Jeans | 003

これは正しいです。なぜなら、003は より小さいから26です。しかし、実際の値ではなく、値の長さを気にする私のアプリケーションではそうではありません。3 文字の長さの値は、2 文字の値よりも大きくなります。私は実際にこれを返す必要があります:

Jeans | 26

長さはの長さ26より短いからです。003

では、実際の最小値ではなく、最小長のコードを持つ行を選択する SQL コードを作成するにはどうすればよいでしょうか? 私はこれをやってみました:

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

上記は1文字しか返さないので、最終的には次のようになります。

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 に答える