2017-09-19 2 views
2

Gibt es eine Möglichkeit, einen Zeichenfolgenwert zu aggregieren, wenn dieser eindeutig ist, oder andernfalls NULL zurückzugeben.So aggregieren Sie entweder den eindeutigen Zeichenfolgenwert oder NULL

Col_A | Col_B | Col_C | Col_D 
    1 | Foo | Bar |  6 
    2 | Foo | NoBar |  0 
    2 | Foo | Foo |  4 
    1 | Foo | Bar |  6 

Damit diese SQL

SELECT SUM(COL_A), STR_AGG_FUNC(COL_B), STR_AGG_FUNC(COL_C),SUM(COL_D) FROM STUFF 

Würde wieder: Zum Beispiel die Tabelle "STUFF" gegeben

Col_A | Col_B | Col_C | Col_D 
    6 | Foo | NULL | 16 

Antwort

6

Sie diese auf die mit max und einer Case-Anweisung tun können Säulen.

select 
    Col_A = sum(Col_A) 
    ,Col_B = case when max(Col_B) = min(Col_B) then max(Col_B) else null end 
    ,Col_C = case when max(Col_C) = min(Col_C) then max(Col_C) else null end 
    ,Col_D = sum(Col_D) 
From 
    Stuff 
+0

Gibt es eine Leistungseinbuße für diesen Ansatz wegen der inhärenten Typkonvertierung? In der Produktion ist mein Tisch ziemlich groß. – mjenkins

+0

Es gibt hier keine echte inhärente Typumwandlung. Es verwendet nur die Groß-/Kleinschreibung der Reihenfolge der Spalte, um die erste/letzte zurückzugeben. Es ist die gleiche Reihenfolge nach Ordnungen einer Varchar-Spalte. 'b' kommen vor' A' einfach basierend auf ihren Unicode-Werten (oder ähnlich der ASCII-Dezimal oder Hex- oder Oct-Reihenfolge). Aggregatfunktionen können jedoch generell besteuert werden. Indizes spielen offensichtlich einen Faktor in max/min. – scsimon

Verwandte Themen