5

SQLServer2008を使用しています。

私は2つのテーブルを持っています

  1. UserUserID, Name, Link
  2. UserNotesNoteID, UserID, Title, Description

これはサンプルのデータ構造です。

INSERT INTO [User]
    ([UserID], [Name], [Link])
VALUES
    (1, 'John', 'L1'),
    (2, 'Steve', 'L234');

INSERT INTO [UserNotes]
    ([NoteID], [UserID], [Title], [Description])
VALUES
    (1, 1, 'AboutJohn', 'This is about john'),
    (2, 1, 'John Work', 'This is where John work'),
    (3, 1, 'John Education', 'This is the uni where John go'),
    (4, 2, 'Steve Note1', 'Des1 about Steve'),
    (5, 2, 'Steve Note2', 'Des2 about Steve');

これがSQLフィドルです

次のようにビュー()を作成したいのですがUser_view、このコマンドを実行すると、次のように出力されます。

SELECT * FROM User_view WHERE UserID IN (1)

UserID    Name   AboutJOhn              JohnWork                  JohnEducation
1         John   This is about john     This is where Johnwork    This is the uni where John go

Title子テーブルの列は列名になりDescription、その列の値になるはずです。行数がわかりません。2人のユーザーと、列名を使用する名前を選択すると、この問題を認識しています。その場合は(複数のユーザーの場合はNote1、Note2、Note3など)を使用できます。それ以外の場合は、タイトルフィールドを列名として使用します。そうすることは可能ですか?乾杯!

4

2 に答える 2

2
CREATE VIEW User_view
AS
SELECT UserID, Name, [AboutJohn], [John Work], [John Education]
FROM 
 (
  SELECT n.UserID, u.Name, n.Title, n.Description
  FROM [User] u JOIN UserNotes n ON u.UserID = n.UserID
  WHERE u.UserID IN (1)
  ) a
PIVOT
 (
  MAX(Description)
  FOR Title IN ([AboutJohn], [John Work], [John Education])
  ) b
于 2012-10-03T07:17:34.963 に答える
1

これはビューではありません。これは、必要に応じて結果を返すプロシージャです。

あなたはそれを次のように呼ぶことができます

proc_UserNotes 1
proc_UserNotes 2

CREATE procedure proc_UserNotes (@UserID int)
as
begin

DECLARE @cols AS NVARCHAR(MAX),
        @cols_WITH_MAX AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX);

select @cols_WITH_MAX = STUFF((SELECT distinct ',MAX(' 
              + QUOTENAME(Title) +') AS ' + QUOTENAME(Title)
                    from [UserNotes] where UserID =@UserID
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Title) 
                    from [UserNotes] where UserID =@UserID
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')        


set @query = 'SELECT [UserID], '+ @cols_WITH_MAX +' FROM(
             SELECT [UserID], ' + @cols + ' from 
            (
            SELECT * FROM 
            [UserNotes]   where UserID ='+cast(@UserID as varchar(20)) +'
            )X

            pivot 
            (
                MAX([Description])
                for [Title] in (' + @cols + ')
            ) p )a GROUP BY [UserID]'


print(@query)
execute(@query)

end 
于 2012-10-03T05:13:39.433 に答える