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

行を列として動的に表示する

    Oracle11gとSqlServer2005+の両方に、必要なことを実行するピボットコマンドが含まれています。

    http://www.orafaq.com/wiki/PIVOT

    http://msdn.microsoft.com/en-us/library/ms177410 .aspx

    それ以外の場合は、これを実現するために動的SQLステートメントを作成する必要があります。

    編集-どうぞ(SQL Serverバージョン)。

    /* Begin Set up of test data */
    IF EXISTS (SELECT 1 from sys.tables WHERE name = N'Item')
        DROP TABLE Item
    GO
    
    IF EXISTS (SELECT 1 from sys.tables WHERE name = N'CrossReference')
        DROP TABLE CrossReference
    GO
    
    
    CREATE TABLE Item
    (
        Item        varchar(20),
        BasePart    varchar(20),
        Size        varchar(20)
    );
    
    CREATE Table CrossReference 
    (
        Item        varchar(20),
        CrossReferenceNumber    varchar(20)
    );
    
    INSERT INTO Item VALUES ('item1', 'b1', 'Large');
    INSERT INTO Item VALUES ('item2', 'bxx1', 'Large');
    INSERT INTO Item VALUES ('item3', 'bddf1', 'Small');
    INSERT INTO Item VALUES ('item4', 'be3f1', 'Small');
    INSERT INTO Item VALUES ('item5', 'b13vx1', 'Small');
    
    INSERT INTO CrossReference VALUES( 'item1', 'crossRef1')
    INSERT INTO CrossReference VALUES('item1', 'crossRef2')
    INSERT INTO CrossReference VALUES('item1', 'crossRef3')
    INSERT INTO CrossReference VALUES('item1', 'crossRef4')
    INSERT INTO CrossReference VALUES('item2', 'crossRef1')
    INSERT INTO CrossReference VALUES('item2', 'crossRef1')
    INSERT INTO CrossReference VALUES('item3', 'crossRef1')
    INSERT INTO CrossReference VALUES('item4', 'crossRef2')
    INSERT INTO CrossReference VALUES('item5', 'crossRef5')
    INSERT INTO CrossReference VALUES('item5', 'crossRef1')
    INSERT INTO CrossReference VALUES('item5', 'crossRef2')
    INSERT INTO CrossReference VALUES('item5', 'crossRef3')
    /* End of test data setup */
    
    /* Begin of actual query */
    DECLARE @xRefs VARCHAR(2000),
            @query VARCHAR(8000)
    
    SELECT @xRefs = STUFF((SELECT DISTINCT '],[' + ltrim(CrossReferenceNumber)
                            FROM CrossReference
                            ORDER BY '],[' + ltrim(CrossReferenceNumber)
                            FOR XML PATH('')
                           ), 1, 2, '') + ']'
    
    SET @query = 
        'SELECT * 
         FROM   Item i
                INNER JOIN 
                (
                    SELECT * 
                    FROM
                    (
                        SELECT Item, CrossReferenceNumber
                        FROM CrossReference
                    ) t
                    PIVOT   (MAX(CrossReferenceNumber) FOR CrossReferenceNumber IN (' + @xRefs + ')) as pvt
    
                ) xRefs
                    ON i.Item = xRefs.Item
         ORDER BY i.Item'
    
    EXECUTE (@query)
    /* end */
    



    1. LinuxでのPostgreSQLデータベースのデフォルトの場所

    2. PHP PDO MySQLとそれは実際にMySQLトランザクションをどのように処理しますか?

    3. MYSQLを使用した1つのクエリで2つのテーブルのCOUNTを選択します

    4. 複数列のインデックスがある場合、単一列のインデックスが必要ですか?