Jak mogę zsumować kilka krotki jak tenJak agregować logiczną kolumny
COL_1 | COL_2 | COL_3 | COL_4
val | T | F | F
val | F | T | F
z OR funkcji i powrócić poniższą tabelę?
COL_1 | COL_2 | COL_3 | COL_4
val | T | T | F
Jak mogę zsumować kilka krotki jak tenJak agregować logiczną kolumny
COL_1 | COL_2 | COL_3 | COL_4
val | T | F | F
val | F | T | F
z OR funkcji i powrócić poniższą tabelę?
COL_1 | COL_2 | COL_3 | COL_4
val | T | T | F
Wystarczy zrobić GROUP BY
użyć MAX()
powrócić T jeśli są dostępne, innego F.
select col_1, max(col_2), max(col_3), max(col_4)
from tablename
group by col_1
Jeśli COL_2
do COL_4
są kolumny tekstowe (char
, varchar
, varchar2
, nvarchar
, nvarchar2
) zawierającego 'T'
lub 'F'
, następnie można po prostu wziąć MAX
z nich, ponieważ 'T' > 'F'
, czyli 'T'
przychodzi po r 'F'
w porządku leksykalnym.
SELECT COL_1, MAX(COL_2) AS COL_2, MAX(COL_3) AS COL_3, MAX(COL_4) AS COL_4
FROM table
GROUP BY COL_1
Objaśnienie: locical działanie lub zwraca PRAWDA, jeżeli co najmniej jeden z argumentów jest spełniony. MAX() zwraca "T"
, jeśli przynajmniej jedna wartość to "T"
, a poza tym "F"
.
Uwaga: Jeśli logiczne kolumny zostały zadeklarowane jako
COL_x NUMBER(1) DEFAULT 0 NOT NULL
lub innego typu liczbowego wtedy wziąłbym MAX(ABS(col_x))
, ponieważ wartość ujemną liczy się jako PRAWDA, jak również. (Jeśli masz frontend Access z ComboBox dołączony do Boolean, to daje wartości 0
lub -1
.)
SELECT col1 = MAX (CONVERT (tinyint, ISNULL (col1,0))) ...
Podobnie jak marginesie (nie działa z Oracle): W PostgreSQL, by to zrobić:
select col_1, bool_or(col_2), bool_or(col_3), bool_or(col_4)
from tablename group by col_1 order by col_1
można wyjaśnić tę odpowiedź trochę? – Forklift