Как создать таблицу, представляющую минимальные и максимальные значения из всех столбцов таблицы?

Мне было интересно, можно ли создать сводную таблицу следующим образом. Учитывая таблицу, например

Id | Age | Banksaldo | Number of children | Car owner 1 | 27 | 2000 | 5 | No 2 | 30 | 3000 | 2 | Yes 

должен превратиться в:

 Column name | Minimum | Minimum Id | Maximum | Maximum Id Age | 27 | 1 | 30 | 2 Banksaldo | 2000 | 1 | 3000 | 2 Number of...| 2 | 2 | 5 | 1 

В частности, у меня возникают проблемы с вызовом оператора SQL, а затем вставка его в новую таблицу. Кроме того, у меня также есть проблемы с его созданием в указанном выше формате.

Может кто-нибудь, пожалуйста, дайте мне несколько советов, как мне подойти к этой проблеме?

Спасибо за ваши старания.

PS: Я, кстати, использую Microsoft SQL Server 2014.

В качестве первого шага вы можете использовать UNPIVOT :

  SELECT Id, [Column Name], Columns FROM (SELECT Id, Age, Banksaldo, [Number of children] FROM mytable) p UNPIVOT (Columns FOR [Column Name] IN (Age, Banksaldo, [Number of children]) )AS unpvt 

для получения следующего набора результатов:

 Id Column Name Columns -------------------------------- 1 Age 27 1 Banksaldo 2000 1 Number of children 5 2 Age 30 2 Banksaldo 3000 2 Number of children 2 

Использование ROW_NUMBER в вышеприведенной производной таблице, чтобы найти минимальные / максимальные записи:

 SELECT Id, [Column Name], Columns, ROW_NUMBER() OVER (PARTITION BY [Column Name] ORDER BY Columns) AS minRn, ROW_NUMBER() OVER (PARTITION BY [Column Name] ORDER BY Columns DESC) AS maxRn FROM ( ... unpivot query here ... ) t 

Вывод сверху :

  Id Column Name Columns minRn maxRn ----------------------------------------------- 2 Age 30 2 1 1 Age 27 1 2 2 Banksaldo 3000 2 1 1 Banksaldo 2000 1 2 1 Number of children 5 2 1 2 Number of children 2 1 2 

В качестве последнего шага вы можете использовать условную агрегацию на minRn , maxRn для получения требуемого набора результатов:

 SELECT [Column Name], MAX(CASE WHEN minRn = 1 THEN Id END) AS [Minimum Id], MAX(CASE WHEN minRn = 1 THEN Columns END) AS [Minimum], MAX(CASE WHEN maxRn = 1 THEN Id END) AS [Maximum Id], MAX(CASE WHEN maxRn = 1 THEN Columns END) AS [Maximum] FROM ( SELECT Id, [Column Name], Columns, minRn, maxRn FROM ( SELECT Id, [Column Name], Columns, ROW_NUMBER() OVER (PARTITION BY [Column Name] ORDER BY Columns) AS minRn, ROW_NUMBER() OVER (PARTITION BY [Column Name] ORDER BY Columns DESC) AS maxRn FROM ( SELECT Id, [Column Name], Columns FROM (SELECT Id, Age, Banksaldo, [Number of children] FROM mytable) p UNPIVOT (Columns FOR [Column Name] IN (Age, Banksaldo, [Number of children]) )AS unpvt ) t ) s WHERE s.minRn = 1 OR s.maxRn = 1 ) u GROUP BY [Column Name] 

Демо-версия SQL Fiddle

Я считаю, что это самый простой способ сделать это, и это очень эффективно. Большинство людей не используют CROSS APPLY, который отлично работает в этом решении.

 DECLARE @yourTable TABLE (ID INT,Age INT, BankSaldo INT,[Number of Children] INT,[Car Owner] CHAR(3)) INSERT INTO @yourTable VALUES (1,27,2000,5,'No'), (2,30,3000,2,'Yes'); WITH CTE_Unpivot AS ( SELECT ID,col,val FROM @yourTable UNPIVOT ( val for col IN ([Age],[BankSaldo],[Number Of Children]) ) unpvt ) SELECT DISTINCT col AS [Column Name], MinCA.val AS Minimum, MinCA.ID AS [Minimum ID], MaxCA.val AS [Maximum], MaxCA.ID AS [Maximum ID] FROM CTE_Unpivot A CROSS APPLY (SELECT TOP 1 val,ID FROM CTE_Unpivot WHERE col = A.col ORDER BY val) MinCA CROSS APPLY (SELECT TOP 1 val,ID FROM CTE_Unpivot WHERE col = A.col ORDER BY val DESC) MaxCA 

Результаты:

 Column Name Minimum Minimum ID Maximum Maximum ID ------------------------- ----------- ----------- ----------- ----------- Age 27 1 30 2 BankSaldo 2000 1 3000 2 Number of Children 2 2 5 1 
Давайте будем гением компьютера.