SORU
9 HAZİRAN 2010, ÇARŞAMBA


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
1 AĞUSTOS 2012, ÇARŞAMBA


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'

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 liste VALUES 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. Parametre N 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 BYgereklidir. 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.)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • REK Roth Productions

    REK Roth Pro

    8 Ocak 2011
  • Sorikan

    Sorikan

    3 ŞUBAT 2008
  • undrmyumbrellaa

    undrmyumbrel

    25 Temmuz 2012