Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL - Завъртете няколко колони без агрегати

Част от проблема е, че сте денормализирали данни в множество колони, които искате да завъртите. В идеалния случай трябва да помислите за коригиране на структурата на вашата таблица, така че да бъде по-лесна за поддръжка и заявки. Ако не можете да коригирате структурата на таблицата, трябва първо да отмените завъртането на колоните, за да приложите PIVOT, за да получите крайния резултат.

Процесът UNPIVOT ще вземе множеството колони и ще ги преобразува в множество редове. В зависимост от вашата версия на SQL Server има няколко начина, по които можете да направите това. Можете да използвате функцията UNPIVOT или тъй като използвате SQL Server 2008, можете да използвате CROSS APPLY с клаузата VALUES за отмяна на завъртането.

Кодът CROSS APPLY/VALUES ще бъде:

изберете t.producttitle, c.col, c.valuefrom tmpData tcross apply( values ​​(abvrMonthName, MonthAvg), (abvrMonthNameCount, MonthCount)) c (col, value) 

Вижте SQL Fiddle с демонстрация . Това отнема множеството ви колони и поставя данните във формат, подобен на този:

<предварителен код>| ЗАГЛАВИЕ НА ПРОДУКТА | COL | СТОЙНОСТ |------------------------------| Продукт 1 | декември | 0 || Продукт 1 | # декември | 0 || Продукт 1 | Ноември | 0 || Продукт 1 | Ноември # | 0 || Продукт 1 | октомври | 0 || Продукт 1 | # октомври | 0 || Продукт 1 | септември | 0 || Продукт 1 | # септември | 0 |

След като данните са в този формат, можете да приложите PIVOT към стойностите в col който съдържа имената на месеците:

изберете producttitle, jan, [jan#], feb, [feb#], mar, [mar#], apr, [apr#], may, [may#], jun, [jun#] , юли, [jul#], aug, [aug#], sep, [sep#], oct, [oct#], nov, [nove#], dec, [dec#]from( select t.producttitle, c .col, c.value от tmpData t cross apply ( values ​​(abvrMonthName, MonthAvg), (abvrMonthNameCount, MonthCount) ) c (col, value)) dpivot( sum(value) for col in (jan, [jan#], feb , [февруари], март, [мар#], апр, [апр#], май, [май#], юни, [юни#], юли, [юли#], август, [авг#], септ, [sep#], oct, [oct#], nov, [nov#], dec, [dec#])) piv; 

Вижте SQL Fiddle с демонстрация . Това дава резултат:

<предварителен код>| ЗАГЛАВИЕ НА ПРОДУКТА | ЯН | JAN# | ФЕВ | ФЕВРУАРИ # | MAR | MAR# | ГПР | APR# | МАЙ | МАЙ# | ЮНИ | JUN# | ЮЛИ | JUL# | АВГУСТ | АВГУСТ # | СЕП | SEP# | OCT | OCT# | НОЕМВРИ | НОЕМВРИ | ДЕК | DEC# |---------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -----------------------------| Продукт 1 | 5 | 2 | 5 | 1 | 5 | 4 | 5 | 6 | 4.44 | 9 | 5 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 || Продукт 2 | 0 | 0 | 0 | 0 | 0 | 0 | 4.33 | 3 | 4.67 | 3 | 5 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 || Продукт 3 | 4.6 | 5 | 4,75 | 8 | 4,75 | 8 | 4 | 6 | 5 | 6 | 5 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Преобразуването не бе успешно при преобразуване на дата и/или час от символен низ при вмъкване на дата и час

  2. Защо SSIS не разпознава разделителя на ред {LF} за подаване на ред, докато импортира UTF-8 плосък файл?

  3. Промяна на колона в SQL Server

  4. T-SQL получава брой работни дни между 2 дати

  5. SQL грешка с подреждане по в подзаявка