Dynamische pivot-Abfrage, die mit PostgreSQL 9.3
Ich habe eine Tabelle namens als Product
:
create table product (
ProductNumber varchar(10),
ProductName varchar(10),
SalesQuantity int,
Salescountry varchar(10)
);
Beispiel-Werte:
insert into product values
('P1', 'PenDrive', 50, 'US')
, ('P2', 'Mouse', 100, 'UK')
, ('P3', 'KeyBoard', 250, 'US')
, ('P1', 'PenDrive', 300, 'US')
, ('P2', 'Mouse', 450, 'UK')
, ('P5', 'Dvd', 50, 'UAE');
Möchte ich generieren die Salescountry's
Namen dynamisch und zeigen die Summe der SalesQuantity
den Verkauf in diesem Land.
Erwartete Ergebnis:
ProductName US UK UAE
----------------------------
PenDrive 350 0 0
Mouse 0 550 0
KeyBoard 250 0 0
Dvd 0 0 50
Ich habe es mit SQL Server 2008 R2:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(SalesCountry)
FROM Product
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT ProductName, ' + @cols + ' from
(
select ProductName
, SalesQuantity as q
, Salescountry
from Product
) x
pivot
(
SUM(q)
for Salescountry in (' + @cols + ')
) p '
PRINT(@query);
execute(@query);
Wie Sie diese erreichen in Postgres?
was ist mit diesem
Panther
Panther, das ist das problem, ich bin mit hier. Im SQL Server habe ich mit
Check dieser
Ein Wort der Warnung: Der code in dem verlinkten blog nicht entgehen Bezeichner, die Pausen mit nicht-standard-Namen und erlaubt SQL-Injektion.
select productname,case when salescountry ='US' then qty else 0 end as "US" ,case when salescountry ='UAE' then qty else 0 end as "UAE" ,case when salescountry ='UK' then qty else 0 end as "UK" from ( select productname,sum(salesquantity) qty,salescountry from Product group by productname,salescountry )y
Panther
Case
ist nicht ein guter Rat für die dynamische Abfrage.Panther, das ist das problem, ich bin mit hier. Im SQL Server habe ich mit
Stuff
.Check dieser
Ein Wort der Warnung: Der code in dem verlinkten blog nicht entgehen Bezeichner, die Pausen mit nicht-standard-Namen und erlaubt SQL-Injektion.
InformationsquelleAutor MAK | 2015-01-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ausführliche Erklärung:
Komplett dynamische Abfrage für die Variation der Anzahl der unterschiedlichen
Salescountry
?Salescountry
direkt inunnest()
und incolumnlist
. Ich will, dass, um dynamisch wie ich getan habe in SQL-Server gezeigt, in der post mit@cols = stuff
.Eine komplett dynamische Abfrage ist kaum möglich, in einem einzigen Aufruf. Müssen Sie erstellen eine dynamic-Anweisung und führen Sie diese in einem zweiten Anruf. Details hier: stackoverflow.com/questions/15506199/...
Link : cureffi.org/2013/03/19/... Gibt mir die komplette
crosstab
Abfrage, Aber das problem ist, dass, Wie kann ich den column-definition-list während der Rückkehr das Ergebnis von der Funktion. Da dieSalescountry
könnte mir die Anzahl der Länder, und das kann änderungen am vorderen Ende, so legen Sie die neuen Landes. Wie kann ich wieder die dynamischecolumn definition list
von der Funktion?Das können Sie nicht. Das ist, warum Sie benötigen zwei Schritte, die ich erwähnt. SQL verlangt zu wissen, den Rückgabetyp. Der blog, den Sie verlinken nicht so viel: verketten einer Aussage über die Funktion in der erste Anruf, die Anweisung auszuführen, die in den zweiten Anruf. (BTW, es ist unsichere haben, offen für SQL-injection!) Es gibt eine Reihe von Ansätzen, aber keiner von Ihnen arbeitet mit einem einzigen Anruf. Sie könnte return arrays statt, das ist möglich, in einem einzigen Aufruf. Lesen Sie den link habe ich Hinzugefügt.
Ich danke Ihnen so sehr.
InformationsquelleAutor Erwin Brandstetter
Während es ein zweistufiger Prozess, diese Methode erstellt eine pivot mit dynamischen Spalten, ohne die Notwendigkeit, geben Sie die Ergebnismenge und ohne erstellen von temporären Tabellen.
Zuerst definieren wir eine Funktion erstellt, die dynamisch vorbereitete Anweisung:
Können Sie jetzt rufen Sie die Funktion
schaffen die vorbereitete Anweisung. Als Nächstes können Sie die vorbereitete Anweisung auszuführen:
InformationsquelleAutor Peter