0

こんにちは、次の表があります。

USE [dm]
GO

/****** Object:  Table [dbo].[Demo]    Script Date: 12/12/2012 08:09:31 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Demo](
    [File] [nvarchar](50) NULL,
    [version] [nchar](10) NULL,
    [label] [nchar](10) NULL
) ON [PRIMARY]

GO

--option A
INSERT INTO [dbo].[Demo]
VALUES (N'123.doc', N'1', NULL)
INSERT INTO [dbo].[Demo]
VALUES (N'123.doc', N'2', NULL)
INSERT INTO [dbo].[Demo]
VALUES (N'123.doc', N'3', N'A')
INSERT INTO [dbo].[Demo]
VALUES (N'123.doc', N'4', NULL)
INSERT INTO [dbo].[Demo]
VALUES (N'123.doc', N'5', N'B')
GO 

次のように、クエリまたはおそらく新しい出力テーブルまたはビューを作成する必要があります (新しい列 CalcVersion に注意してください)。プログラミング言語を使わずにそれを行う方法はありますか?

File    version    label   CalcVersion
123.doc 1           NULL   A.1
123.doc 2           NULL   A.2
123.doc 3           A      A.3   
123.doc 4           NULL   B.1
123.doc 5           B      B.2

別の考えられるシナリオは次のとおりです。

option B
INSERT INTO [dbo].[Demo]
VALUES (N'123.doc', N'1', N'A')
INSERT INTO [dbo].[Demo]
VALUES (N'123.doc', N'2', NULL)
INSERT INTO [dbo].[Demo]
VALUES (N'123.doc', N'3', NULL)
INSERT INTO [dbo].[Demo]
VALUES (N'123.doc', N'4', N'B')

その場合、結果は次のようになります。

File    version   label   CalcVersion
123.doc 1           A      A.1         
123.doc 2           NULL   B.1
123.doc 3           NULL   B.2
123.doc 4           B      B.3 

お知らせ下さい。ありがとうございました。

4

1 に答える 1

0

私はそれを行くと思います:

 UPDATE demo set ver =(
      (SELECT TOP 1 label FROM demo t WHERE t.[file] = pt.[file] 
      and cast(t.[version] as int) > cast(pt.[version] as int) 
            AND t.label is NOT NULL 
       ORDER BY pt.[version] asc)) from demo pt
where pt.label is NULL;

次のようにランクと連結するよりも:

    select *,     ver + '.' + cast(RANK() over (partition by [file] order by version asc) as 
varchar(10)) as ver from demo where label is null;
于 2012-12-13T02:31:46.927 に答える