Konvertieren von Zeilen zu Spalten, die Duplikate

stimmen
1

Betrachten Sie die folgende Tabelle und Zeilen:

Listing A.

ID, name, event, type
1, 'John Doe', '2010-09-01 15:00:00.000', 'input'
1, 'John Doe', '2010-09-03 11:00:00.000', 'input'
1, 'John Doe', '2010-09-04 17:00:00.000', 'input'
1, 'John Doe', '2010-09-02 15:00:00.000', 'output'
1, 'John Doe', '2010-09-03 16:00:00.000', 'output'
1, 'John Doe', '2010-09-06 17:00:00.000', 'output'

Was ich will, ist Zeilen in Spalten zu konvertieren, so dass ich zwei verschiedene Säulen, Eingangsereignis und Ausgabeereignis hat. Mögen:

Listing B.

ID, name, input event, output event
1, 'John Doe', '2010-09-01 15:00:00.000', '2010-09-02 15:00:00.000'
1, 'John Doe', '2010-09-03 11:00:00.000', '2010-09-03 16:00:00.000'
1, 'John Doe', '2010-09-04 17:00:00.000', '2010-09-06 17:00:00.000'

Ich konnte so etwas wie folgt erhalten:

Listing C.

ID, name, input event, output event
1, 'John Doe', '2010-09-01 15:00:00.000', null
1, 'John Doe', '2010-09-03 11:00:00.000', null
1, 'John Doe', '2010-09-04 17:00:00.000', null
1, 'John Doe', null, '2010-09-02 15:00:00.000'
1, 'John Doe', null, '2010-09-03 16:00:00.000'
1, 'John Doe', null, '2010-09-06 17:00:00.000'

, Aber das Problem ist, wie man flach die Zeilen, da der doppelten Tupel-ID-Name relevant sind. Zum Konvertieren von Zeilen in Spalten Code, den ich in der Regel etwas wie folgt aus:

select ID, name, max(case when type = 'input' then event else null end) as 'input event', max(case when type = 'output' then event else null end) as 'output event' from events group by ID, name

, Aber natürlich wird die GROUP BY gehen die Duplikate auszulassen, und das ist, was ich nicht will.

Irgendwelche Ideen, wie man erreichen, dass bei einer Abfrage?

Es wäre schön, eine portable SQL-Lösung oder für postgresql zu haben, aber jede Idee wird sehr geschätzt.

EDIT: sorry für die verspätete Antwort. Beiden Lösungen von AlexRednic und Mark Bannister erreichen, was ich wollte. Ich entschied mich schließlich für die zweite, da es klarer zu mir aussieht. Vielen Dank allen für Ihre Antworten!

Veröffentlicht am 01/09/2010 um 06:32
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
2

Versuche Folgendes:

select ID, name, event as 'input event', 
       (select min(o.event) 
        from events o 
        where o.type = 'output' and 
              i.ID = o.ID and 
              i.name = o.name and 
              i.event < o.event) as 'output event' 
from events i
where i.type = 'input'
group by ID, name, event
Beantwortet am 02/09/2010 um 10:56
quelle vom benutzer

stimmen
1
select t1.id,t1.name,t1.event,t2.event from test t1
    inner join test t2 on t1.event <= t2.event 
        and t1.type = 'input' 
        and t2.type = 'output'
                   and t1.id = t2.id
                   and t1.name = t2.name

Die Sache ist, Sie müssen irgendwie die Eingabe / Ausgabe-Sitzungen zu verbinden. In dieser Abfrage habe ich es durch den Zeitstempel Ereignis Spalte. Könnten Sie weitere Informationen zur Verfügung stellen, wenn dies nicht das, was Sie wollen?

Aktualisieren: jetzt, um post-Prozess ein wenig Sie tun können ,

with a as
(
select t1.id,t1.name,t1.event as in_event,t2.event as out_event from test t1
    inner join test t2 on t1.event <= t2.event 
                   and t1.type = 'input' 
                   and t2.type = 'output'
                   and t1.id = t2.id
                   and t1.name = t2.name
)
select id,name,in_event,min(out_event)
       from a
group by id,name,in_event
Beantwortet am 01/09/2010 um 11:03
quelle vom benutzer

stimmen
0

Ich bin von Anfang an zu schreiben:

create table #a(
ID int,
name varchar(30),
event datetime,
type varchar(10)
)

insert #a
select  
1, 'John Doe', '2010-09-01 15:00:00.000', 'input'
union select 1, 'John Doe', '2010-09-01 16:00:00.000', 'input'
union select 1, 'John Doe', '2010-09-01 17:00:00.000', 'input'
union select 1, 'John Doe', '2010-09-02 15:00:00.000', 'output'
union select 1, 'John Doe', '2010-09-02 16:00:00.000', 'output'
union select 1, 'John Doe', '2010-09-02 17:00:00.000', 'output'

- hier ist die Lösung SQL

select 
    ID, 
    name, 
    case when type = 'input' then event else null end "input event",
    case when type = 'output' then event else null end "output event"
 from #a
Beantwortet am 01/09/2010 um 07:38
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more