1

テーブルをそれ自体に結合したままにしたり、ケースステートメントを使用してビュー内の最大値を割り当てたりするにはどうすればよいか疑問に思っていました。次のテーブルがあるとします。

 Lastname     Firstname     Filename
 Smith        John          001
 Smith        John          002
 Smith        Anna          003
 Smith        Anna          004

すべての値をリストするビューを作成したいのですが、次のように、現在の行が最大行であるかどうかを表示する別の列もあります。

 Lastname     Firstname     Filename     Max_Filename
 Smith        John          001          NULL
 Smith        John          002          002
 Smith        Anna          003          NULL
 Smith        Anna          004          NULL

これは可能ですか?次のクエリを試しました。

 SELECT Lastname, Firstname, Filename, CASE WHEN Filename = MAX(FileName) 
 THEN Filename ELSE NULL END AS Max_Filename

しかし、Lastname は group by 句に含まれていないと言われました。ただし、Lastname、firstname、filename でグループ化すると、max_filename 内のすべてが filename と同じになります。

私が間違っていることと、このクエリを機能させる方法を理解するのを手伝ってもらえますか?

4

3 に答える 3

1

それは次のようなものかもしれません:

SELECT 
    T.Lastname, 
    T.FirstName, 
    T.Filename,
    CASE (SELECT MAX(T1.Filename) FROM MyTable T1 
            WHERE T.Lastname = T1.Lastname AND T.FirstName = T1.FirstName)
        WHEN T.Filename THEN T.Filename
        ELSE NULL
    END
FROM MyTable T

しかし、最大ファイル名の意味がわかりませんか? すべてのレコードの合計最大数? それとも名前ごとに分けて?期待される結果も一致しません。お知らせいただければ、クエリを修正します。

于 2013-09-29T09:13:16.267 に答える
0

これを試して。

DECLARE @TAB2 TABLE(LASTNAME VARCHAR(40), FIRSTNAME VARCHAR(40), FILENAME VARCHAR(40)) 
INSERT INTO @TAB2 VALUES 
( 'Smith',        'John',          '001'),
( 'Smith',        'John',          '002'),
( 'Smith',        'Anna',          '003'),
( 'Smith',        'Anna',          '004')

SELECT 
    LASTNAME, 
    FIRSTNAME, 
    FILENAME,
    CASE ROW_NO WHEN 2 THEN FILENAME ELSE NULL END AS  MAX_FILENAME
FROM 
(
    SELECT 
        LASTNAME, 
        FIRSTNAME, 
        FILENAME,
        ROW_NO = ROW_NUMBER() OVER (PARTITION BY FIRSTNAME ORDER BY FILENAME ASC) 
     FROM @TAB2
 )A
于 2013-09-30T10:22:03.760 に答える