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

MS SQL 2012 :SQL では、列に 0 が含まれている場合、列を左側にシフトします

    これで必要なことが行われます (デモ )

    SELECT i.cust_id,
           oa.*
    FROM   input_table i
           OUTER APPLY (SELECT pvt.*
                        FROM   (SELECT month,
                                       col = CONCAT('month', ROW_NUMBER() OVER (ORDER BY idx))
                                FROM   (SELECT month,
                                               idx,
                                               to_preserve = MAX(IIF(month=0,0,1)) OVER (ORDER BY idx)
                                        FROM   (VALUES (1, month1),
                                                       (2, month2),
                                                       (3, month3),
                                                       (4, month4),
                                                       (5, month5) ) V(idx, month)) unpvt
                                WHERE  to_preserve = 1) t 
                                PIVOT (MAX(month) FOR col IN (month1, month2, month3, month4, month5)) pvt
                                ) oa 
    

    一度に 1 行ずつ列の値をアンピボットします。

    例えば ​​C3

    にピボットされなくなります
    +---------+-------+-----+-------------+
    | cust_id | month | idx | to_preserve |
    +---------+-------+-----+-------------+
    | c3      |     0 |   1 |           0 |
    | c3      |     0 |   2 |           0 |
    | c3      |   100 |   3 |           1 |
    | c3      |     0 |   4 |           1 |
    | c3      |     0 |   5 |           1 |
    +---------+-------+-----+-------------+
    

    MAX(IIF(month=0,0,1)) OVER (ORDER BY idx) 式は、最初のゼロ以外の 1 以降のすべての値が to_preserve を持つことを保証します 1 に設定 .

    次に、to_preserve で値を選択します フラグを立て、ROW_NUMBER を使用します 正しい新しい列にピボットするために使用できる値を提供します。




    1. T-SQL 自由位置のマトリックス テーブルをクエリします。

    2. BLOBOracle10gへの画像の挿入

    3. Oracleから各グループの最新の行を選択します

    4. MySQLエラー1215:外部キー制約を追加できません