2015-04-16 6 views
5

Zastanawiam się, czy możliwe jest utworzenie tabeli podsumowania w następujący sposób. Biorąc pod stół, na przykładJak utworzyć tabelę przedstawiającą wartości minimalne i maksymalne ze wszystkich kolumn podanych w tabeli?

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

powinna przekształcić:

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

Konkretnie mam problemy z wywołaniem instrukcji SQL, a następnie wkładając go do nowej tabeli. Ponadto mam również problemy z utworzeniem go w określonym formacie powyżej.

Czy ktoś mógłby podać mi kilka wskazówek, w jaki sposób powinienem podejść do tego problemu?

Dzięki za twoje wysiłki.

PS: Jestem w drodze z wykorzystaniem Microsoft SQL Server 2014.

+1

http://stackoverflow.com/questions/1979046/sql-query-minimum-maximum odpowiedź Marka mogą być wykorzystane do – Hypaethral

+0

sprawdzić moją odpowiedź. Jest prosty i wydajny. – Stephan

Odpowiedz

2

Jako pierwszy krok, można użyć 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 

aby uzyskać następujący zestaw wyników:

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 

Użycie ROW_NUMBER dla powyższej tabeli pochodnej w celu zlokalizowania rekordów min/maks:

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 

Wyjście z góry:

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 

W końcowym etapie, można użyć agregacji warunkową na minRn, maxRn do uzyskania wymaganej zestaw wyników:

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 Demo

2

Uważam, że jest to najprostszy sposób na zrobienie tego i jest bardzo skuteczny t. Większość ludzi nie używa CROSS APPLY, który doskonale sprawdza się w tym rozwiązaniu.

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 

Wyniki:

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