Sqlserver
 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 

Той отменя завъртането на стойностите на колоната ред по ред.

Например 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) израз гарантира, че всички стойности от първата различна от нула нататък имат to_preserve зададен на 1 .

След това избира стойностите с to_preserve флаг и използва ROW_NUMBER за предоставяне на стойност, която може да се използва за завъртане в правилната нова колона.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Къде се записва задействане на сървър в SQL Server?

  2. SSRS:повторете стойността на групата редове в най-ляво табликс на всеки ред

  3. Вътрешно присъединяване с условие if

  4. Еквивалент на LIMIT в T-SQL

  5. Поправка:„BACKUP LOG не може да се извърши, защото няма текущо архивиране на базата данни.“ в SQL Server/SQL Edge