sql >> データベース >  >> RDS >> Sqlserver

単一の行にすべての子を持つ単一の親を取得します

    あなたの例はピボットに近づいていますが、この例ではピボット機能が使用できるとは思いません.

    正気を保つために、例の名前を「child-parent」ではなく「department-person」に変更しました。

    だから、最初のテーブルといくつかのデータ

    DECLARE @Department TABLE
      ( 
       DepartmentID int
      ,DepartmentName varchar(50)
      )
    DECLARE @Person TABLE
      ( 
       PersonID int
      ,PersonName varchar(50)
      ,DepartmentID int
      )
    
    INSERT  INTO @Department
      ( DepartmentID, DepartmentName )
     SELECT 1, 'Accounting' UNION
     SELECT 2, 'Engineering' UNION
     SELECT 3, 'Sales' UNION
     SELECT 4, 'Marketing' ;
    
    INSERT  INTO @Person
      ( PersonID, PersonName, DepartmentID )
     SELECT 1, 'Lyne', 1 UNION
     SELECT 2, 'Damir', 2 UNION
     SELECT 3, 'Sandy', 2 UNION
     SELECT 4, 'Steve', 3 UNION
     SELECT 5, 'Brian', 3 UNION
     SELECT 6, 'Susan', 3 UNION
     SELECT 7, 'Joe', 4 ;
    

    ここで、モデルをフラット化したいと考えています。テーブル変数があるため、一時テーブルを使用しますが、「実際のテーブル」のビューも適しています。

    /*  Create a table with:
        DepartmentID, DepartmentName, PersonID, PersonName, PersonListIndex
    
     This could be a view instead of temp table. 
    */
    IF object_id('tempdb.dbo.#tmpTbl','U') IS NOT NULL
     DROP TABLE #tmpTbl
    
    ;
    WITH  prs
            AS ( SELECT PersonID
                       ,PersonName
                       ,DepartmentID
                       ,row_number() OVER ( PARTITION BY DepartmentID ORDER BY PersonID ) AS [PersonListIndex]
                 FROM   @Person
               ),
          dptprs
            AS ( SELECT d.DepartmentID
                       ,d.DepartmentName
                       ,p.PersonID 
                       ,p.PersonName
                       ,p.PersonListIndex
                 FROM   @Department AS d
                        JOIN prs AS p ON p.DepartmentID = d.DepartmentID
               )
    SELECT * INTO #tmpTbl FROM dptprs
    
    -- SELECT * FROM #tmpTbl
    

    動的列は動的クエリを意味します。行ごとにテーブルに構成します

    /* Table to compose dynamic query */
    DECLARE @qw TABLE
      ( 
       id int IDENTITY(1, 1)
      ,txt nvarchar(500)
      )
    
    /* Start composing dynamic query */
    INSERT  INTO @qw ( txt ) VALUES  ( 'SELECT' ) 
    INSERT  INTO @qw ( txt ) VALUES  ( '[DepartmentID]' )
    INSERT  INTO @qw ( txt ) VALUES  ( ',[DepartmentName]' ) ;
    
    
    /* fetch max number of employees in a department */
    DECLARE @i int ,@m int
    SET @m = (SELECT max(PersonListIndex) FROM #tmpTbl)
    
    /* Compose dynamic query */
    SET @i = 1
    WHILE @i <= @m 
      BEGIN  
          INSERT  INTO @qw ( txt )
                SELECT  ',MAX(CASE [PersonListIndex] WHEN '
                        + cast(@i AS varchar(10)) + ' THEN [PersonID] ELSE NULL END) AS [Person_'
                        + cast(@i AS varchar(10)) + '_ID]'
    
          INSERT  INTO @qw ( txt )
                SELECT  ',MAX(CASE [PersonListIndex] WHEN '
                        + cast(@i AS varchar(10)) + ' THEN [PersonName] ELSE NULL END) AS [Person_'
                        + cast(@i AS varchar(10)) + '_Name]'  
    
        SET @i = @i + 1
      END
    
    /* Finish the dynamic query */
    INSERT  INTO @qw (txt) VALUES ( 'FROM #tmpTbl' )
    INSERT  INTO @qw (txt) VALUES ( 'GROUP BY [DepartmentID], [DepartmentName]' )
    INSERT  INTO @qw (txt) VALUES ( 'ORDER BY [DepartmentID]' )
    
    -- SELECT * FROM @qw
    

    そして今、すべてのクエリ行を変数に連結して実行します

    /* Create a variable with dynamic sql*/
    DECLARE @exe nvarchar(4000)
    SET @exe=''
    SELECT  @exe = @exe + txt + ' ' FROM @qw ORDER BY id
    
    /* execute dynamic sql */
    EXEC master..sp_executesql @exe
    

    その結果がこちら:



    1. 2つの異なるEC2インスタンスでのDjangoとPostgreSQLのセットアップ

    2. MySQLクエリで最も近い数値を選択する

    3. mysqlでrakedb:migrateコマンドを使用してRailsでテーブルを作成する際の主キーの問題

    4. 重複/類似の列値を持つ行を検索するMySQL