PostgreSQL Çapraz Sorgu
Herhangi bir PostgreSQL içinde çapraz sorgu oluşturmak için nasıl biliyor mu?
Örneğin şu tablo var:
Section Status Count
A Active 1
A Inactive 2
B Active 4
B Inactive 5
Sorgu aşağıdaki çapraz iade etmek istiyorum:
Section Active Inactive
A 1 2
B 4 5
Bu mümkün mü?
CEVAP
additional module tablefunc
yükleyinbir kezişlevi crosstab()
sağlayan veritabanı başına. PostgreSQL 9.1 beri bunun için CREATE EXTENSION
kullanabilirsiniz:
CREATE EXTENSION tablefunc;
Gelişmiş test çalışması
CREATE TEMP TABLE t (
section text
, status text
, ct integer -- don't use "count" as column name.
);
INSERT INTO t VALUES
('A', 'Active', 1), ('A', 'Inactive', 2)
, ('B', 'Active', 4), ('B', 'Inactive', 5)
, ('C', 'Inactive', 7); -- no row for C with 'Active'
count
reserved word, sütun adı olarak kullanmayın.
Basit bir form - eksik öznitelik için uygun
crosstab()
ilebirparametre:
SELECT *
FROM crosstab(
'SELECT section, status, ct
FROM t
ORDER BY 1,2') -- needs to be "ORDER BY 1,2" here
AS ct ("Section" text, "Active" int, "Inactive" int);
Verir:
Section | Active | Inactive --------- -------- ---------- A | 1 | 2 B | 4 | 5 C | 7 |
- Döküm ve yeniden adlandırma gerek.
- Notyanlış
C
sonuç:7
ilk sütun doldurulur değer.
Güvenli form
crosstab()
ileikiparametreler:
SELECT * FROM crosstab(
'SELECT section, status, ct
FROM t
ORDER BY 1,2' -- could also just be "ORDER BY 1" here
,$$VALUES ('Active'::text), ('Inactive')$$)
AS ct ("Section" text, "Active" int, "Inactive" int);
Verir:
Section | Active | Inactive --------- -------- ---------- A | 1 | 2 B | 4 | 5 C | | 7
C
doğru sonuç unutmayın.ikinci parametreherhangi bir sorgu olabilir döndürürsatırbaşına sütun tanımı sırasını eşleşen sonunda bağlıyor. Genellikle bu gibi temel tablo farklı niteliklerini sorgulamak istiyorum
'SELECT DISTINCT attribute FROM tbl ORDER BY 1'
Bu el kitabında.
Beri senin için heceleyerek tüm sütunlar bir sütun tanım listesi zaten dışında (önceden tanımlanmış
crosstabN()
türevleri), düzenli olarak daha etkili sağlamak için bir kısa listeVALUES
ifadesi gibi göstermek:$$VALUES ('Active'::text), ('Inactive')$$)
Ya da:
$$SELECT unnest('{Active,Inactive}'::text[])$$ -- shorter for long lists
Budeğilkılavuzda.
dollar quoting daha kolay alıntı yapmak için kullandım.
Gelişmiş örnekler
Düzeltici
previously accepted answer by Jeremiah eskidir.
- İşlevi
crosstab(text, integer)
varyantımodası geçmiş.integer
ikinci parametre göz ardı edilir. current manual alıntı yapıyorum:
crosstab(text sql, int N)
...
crosstab(text)
eski sürüm. ParametreN
artık yok sayılır, değer sayısı bu yana sütunlar her zaman arama sorgusu tarafından belirlenir
Gereksiz döküm ve yeniden adlandırma.
Eğer bir satır tüm niteliklere sahip değilse başarısız olur. İki metin parametreleri düzgün ile ilgili güvenli bir varyantı varöznitelikleri eksik.
ORDER BY
gereklidir. 47**: El Kitabı okuyorum
Pratikte SQL sorgusu her zaman
ORDER BY 1,2
sağlamak için belirtmeniz gerekir bu giriş satırları doğru sıralanır
(Orada kullanılan crosstab()
bir parametre formu için geçerlidir.)
Nasıl yeni PostgreSQL JSON veri türü i...
Güncelleştirme veya Ekleme (çoklu satı...
PostgreSQL sorgu kullanarak güncelleşt...
Nasıl PostgreSQL sorgu bir değişkeni b...
Nasıl MySQL ve PostgreSQL için büyük /...