Web design and hosting, database, cloud and social media solutions that deliver business results
  • Бизнес решения
    • Веб-дизайн сайта
      • Безопасность веб-сайта
      • Остров Уайт
    • Бизнес-услуги
      • Microsoft Azure
    • Microsoft Office
    • Социальные медиа
  • Службы баз данных
    • Отчеты
      • Claytabase Server Disk IOPs Calculator
      • SQL-принтер
      • Восстановление кода SQL
    • Проверка телефонного номера в правильном формате Великобритании с SQL Server 2008
  • О нас
    • команда
      • Chester Copperpot
      • Гэвин Клейтон
    • Портфолио
  • Академия
    • Базы данных обучения
      • SQL-Server
      • В SQL Server 2008 план обслуживания
      • Использование SQL Server Pivot-Unpivot
      • Использование дат SQL Server
      • Использование функций SQL Server
    • Изучение веб-дизайна
      • ASP-NET
      • CSS
عربى (AR)čeština (CS)Deutsch (DE)English (EN-GB)English (EN-US)Español (ES)فارسی (FA)Français (FR)हिंदी (HI)italiano (IT)日本語 (JA)polski (PL)Português (PT)русский (RU)Türk (TR)中国的 (ZH)

SQL Server использует UNPIVOT для преобразования столбцов в строки

SQL Server, использующий функцию UNPIVOT в сценарии реального мира.

Кейс по избавлению от CASE

Использование Pivot / Unpivot

Многие из проектов, над которыми мы работали, включали работу с данными, хранящимися в таблице с месяцами с 1 по 12, хранящимися по годам. Это не редкое решение, но оно может привести к тому, что операторы SQL раздуваются десятками операторов CASE.

Эти операторы CASE затрудняют сопровождение, а также могут быть источником человеческих ошибок.

Ниже мы создали простой набор данных в соответствии с реальным примером, а в SQL Server есть функция, которая превращает столбцы в строки.

UnPivIDUnPivYearM1M2M3M4M5M6M7M8M9M10M11M12
12010123456789101112
12011123456789101112
12012123456789101112
22010123456789101112

Кейс по избавлению от CASE

Если вы используете SQL Server ниже 2012, вам нужно будет создать эту функцию, которая является эквивалентом функции DATEFROMPARTS, встроенной с 2012 года.
Подробнее: функция SQL Server DATEFROMPARTS для версий до 2012 г.

Кейс по избавлению от CASE

Затем мы можем создать временную таблицу и заполнить ее данными из примера выше.

SQL

DECLARE @UnPiv TABLE (UnPivID INT, UnPivYear SMALLINT, M1 INT, M2 INT, M3 INT, M4 INT, M5 INT, M6 INT, M7 INT, M8 INT, M9 INT, M10 INT, M11 INT, M12 INT)INSERT INTO @UnPiv(UnPivID,UnPivYear,M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12)SELECT 1,2010,1,2,3,4,5,6,7,8,9,10,11,12INSERT INTO @UnPiv(UnPivID,UnPivYear,M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12)SELECT 1,2011,1,2,3,4,5,6,7,8,9,10,11,12INSERT INTO @UnPiv(UnPivID,UnPivYear,M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12)SELECT 1,2012,1,2,3,4,5,6,7,8,9,10,11,12INSERT INTO @UnPiv(UnPivID,UnPivYear,M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12)SELECT 2,2010,1,2,3,4,5,6,7,8,9,10,11,12
SELECT UnPivID,UnPivYear,REPLACE(col,'M','') UnPivMonth,dbo.c1bs_DateFromParts(UnPivYear,REPLACE(col,'M',''),1) UnPivDate,DateFromParts(UnPivYear,REPLACE(col,'M',''),1) UnPivDateFrom2012,valFROM @UnPivUNPIVOT (Val FOR col IN (M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,M11,M12)) unpiv

Кейс по избавлению от CASE

Это должно вернуть набор данных, как показано ниже.

Results

UnPivIDUnPivYearUnPivMonthUnPivDateUnPivDate2012val
12010101/01/201001/01/20101
12010201/02/201001/02/20102
12010301/03/201001/03/20103
12010401/04/201001/04/20104
12010501/05/201001/05/20105
12010601/06/201001/06/20106
12010701/07/201001/07/20107
12010801/08/201001/08/20108
12010901/09/201001/09/20109
120101001/10/201001/10/201010
120101101/11/201001/11/201011
120101201/12/201001/12/201012
12011101/01/201101/01/20111
12011201/02/201101/02/20112
12011301/03/201101/03/20113
12011401/04/201101/04/20114
12011501/05/201101/05/20115
12011601/06/201101/06/20116
12011701/07/201101/07/20117
12011801/08/201101/08/20118
12011901/09/201101/09/20119
120111001/10/201101/10/201110
120111101/11/201101/11/201111
120111201/12/201101/12/201112
12012101/01/201201/01/20121
12012201/02/201201/02/20122
12012301/03/201201/03/20123
12012401/04/201201/04/20124
12012501/05/201201/05/20125
12012601/06/201201/06/20126
12012701/07/201201/07/20127
12012801/08/201201/08/20128
12012901/09/201201/09/20129
120121001/10/201201/10/201210
120121101/11/201201/11/201211
120121201/12/201201/12/201212
22010101/01/201001/01/20101
22010201/02/201001/02/20102
22010301/03/201001/03/20103
22010401/04/201001/04/20104
22010501/05/201001/05/20105
22010601/06/201001/06/20106
22010701/07/201001/07/20107
22010801/08/201001/08/20108
22010901/09/201001/09/20109
220101001/10/201001/10/201010
220101101/11/201001/11/201011
220101201/12/201001/12/201012

Was this helpful?

Please note, this commenting system is still in final testing.

Author

Copyright Claytabase Ltd 2020

Registered in England and Wales 08985867

RSSLoginLink Политика в отношении файлов cookieКарта сайта

Social Media

facebook.com/Claytabaseinstagram.com/claytabase/twitter.com/Claytabaselinkedin.com/company/claytabase-ltd

Get in Touch

+442392064871info@claytabase.comClaytabase Ltd, Unit 3d, Rink Road Industrial Estate, PO33 2LT, United Kingdom
Настройки на этом сайте настроены так, что разрешены все файлы cookie. Их можно изменить на странице политики и настроек cookie. Продолжая использовать этот сайт, вы соглашаетесь на использование файлов cookie.
Ousia Logo
Logout
Ousia CMS Loader