Transform in Pivot

grauer wolf60

Neuer Benutzer
Beiträge
4
Hallo,

habe ein kleines Problem. In Access funktioniert die Abfrage einwandfrei.
TRANSFORM Count(*) AS Ausdr1
SELECT DateDiff("yyyy",[P_Gebdat],[Implantdatum]) AS [Alter]
FROM Patienten INNER JOIN CI_data ON Patienten.P_id = CI_data.CIdata_id
GROUP BY DateDiff("yyyy",[P_Gebdat],[Implantdatum])
PIVOT geschlecht in ("männlich","Weiblich");

Leider schaffe ich es nicht diese in T-SQL umzusetzten. Herauskommen soll eine Alterspyramide zum Zeitpunkt der Implantation. WIe gesagt, die Aufteilung soll nachher in männlich und weiblich dargestellt werden nach Alter von 0 bis 97. Wer kann mir hier helfen? Mit SQL Pivot kenne ich mich nicht so gut aus.

Gruß Wolfgang
PS SQL Server 2016 SP3
 
Werbung:

dabadepdu

Datenbank-Guru
Beiträge
986
Access ist leider relativ weit entfernt vom SQL Standard, offenbar sogar vom hauseigenen "großen Bruder". Du musst die Abfrage umschreiben.
In SQL Server sieht es grob so aus:
Code:
SELECT *
  FROM (SELECT pivot_column, additional_column, aggregate_function(column)
          FROM table1 alias1
         INNER JOIN table2 alias2
            ON alias2.common_column = alias1.common_column) alias3
PIVOT(aggregate(column)
   FOR pivot_column IN(value1, value2, ……………, valueN)) alias4;
Also kein Transform und ein leicht geänderte Struktur der Abfrage, versuch mal.
 
Zuletzt bearbeitet von einem Moderator:

grauer wolf60

Neuer Benutzer
Beiträge
4
Sorry dasss ich mich so spät melde, war kurzzeitig im Ausland. Vielen Dank für deine Rückmledung. Leider hilft mir der Code nicht. Wenn ich das so einsetzte zeigt er mir immer Fehlermeldung an. Wie gesagt, haben wir SQL Server 2016. Eventuelle hat da der PIVOT Befehl ne andere Syntax. Jedenfalls funktioniert er so nicht: Hier der Versuch, das umzusetzen:
Code:
Select *
From (Select, geschlecht, DateDiff("yyyy",[P_Gebdat],[Implantdatum]), count(*)
FROM Patienten
INNER JOIN CI_data
ON Patienten.P_id = CI_data.CIdata_id
PIVOT (count(geschlecht))
FOR geschlecht IN(männlich, weiblich))

Msg 102, Level 15, State 1, Line 118
Falsche Syntax in der Nähe von "(".

Und so sollte es aussehen:
a.jpg
........

Gruß Wolfgang
 

dabadepdu

Datenbank-Guru
Beiträge
986
Kein Problem, ich war so lange im Inland.
Eventuelle hat da der PIVOT Befehl ne andere Syntax.
Das ist nicht evtl. so, das kann man genau nachlesen in der Doku. Ich habe Dir ein Beispiel hingeschrieben.
Du hast ein Komma zuviel und falsch geklammert.
Noch mal kompakter als im ersten Beispiel die Struktur in MS SQL:
Code:
SELECT alias4.*
  FROM (<irgendein Select-Statement oder Tabelle>) alias3
 PIVOT(aggregate(alias3.irgendeine_column)
   FOR alias3.irgendeine_column_mit_Werten IN(<Werteliste>)) alias4;

ergibt sowas:
Code:
select * from 
 (Select DateDiff("yyyy",p.p_gebdat,c.implantdatum) as "Alter", 
         geschlecht
    FROM patienten p INNER JOIN CI_data c
      ON p.p_id = c.CIdata_id
 ) da
 PIVOT 
 (count (da.geschlecht)
    FOR da.geschlecht IN([männlich], [weiblich])
 ) as pv
[code]

oder mit früher Gruppierung bereits in den Rohdaten:

[code]
select * from 
 (Select DateDiff("yyyy",p.p_gebdat,c.implantdatum) as "Alter", 
         geschlecht, count(*) _count
    FROM patienten p INNER JOIN CI_data c
      ON p.p_id = c.CIdata_id
   group by DateDiff("yyyy",p.p_gebdat,c.implantdatum), 
         geschlecht
 ) da
 PIVOT 
 (sum (da._count)
    FOR da.geschlecht IN([männlich], [weiblich])
 ) as pv

Zum besseren Verständnis für Forenmitglieder oder auch sich selbst oder Kollegen ist es immer gut, Spaltennamen vollständig mit Aliasen zu versehen. Fehlte bei Dir, hab ich nur geraten. Du musst also Die Spaltenherkunft vielleicht korrigieren.
 
Werbung:
Oben