2016-07-27 3 views
0

So habe auf dieses Problem eine Weile steckte ich kombinierte Name + Wert als Spalten in Spalten dieser Zeilen Namen hat, obwohl ich viele Dinge ausprobiert:Wie Reihen von spezifischen ID zu transformieren, die für diese eindeutige ID

So habe ich eine Tabelle wie folgt aus:

model | type | serialNumber | revisionNumber | value | name 
----------------------------------------------------------- 

A | T1 | 2199 | 5 | 17 | sensitivity  
A | T1 | 2199 | 5 | > 100 | resistance 
A | T1 | 2199 | 5 | 19-04-2016 | calibration  
A | T1 | 2199 | 5 | 17 | sensitivity 

B | T1 | 2500 | 5 | 17 | sensitivity  

(was sehr merkwürdig ist, ich weiß, aber nur auf der DB arbeiten nicht entworfen)

Nun das Problem ist, dass ich will Elemente auszuwählen, die haben ein bestimmtes MODELL, TYPE und haben ein KALIBRIERUNGSDATUM zwischen zwei Daten. Zugleich möchte ich der Abfrage führen, mir zu zeigen, die Werte der Attribute Empfindlichkeit und Kalibrierung (und noch mehr Attribute später) und die Ergebnisse der Abfrage in Form zu erhalten:

model | type | serialNumber | revisionNumber | sensitivity | resistance | ... 

, wo ein revisionNumber und serialNumber eindeutig ein Modell definieren, und geben

I mit ROW_NUMBERS und der PARTITION BY Funktion versucht, arbeiten die drei Attribute eine eindeutige ID zu geben, und dann einen Aliasnamen verwenden, sie in eine Säule zu setzen. Aber das Problem ist, dass ich nicht weiß, wie ein ALIAS basierend auf dem Kriterium, dass die ID der drei Attribute identisch ist, zugeordnet wird. Oder gibt es einen besseren Weg, dies zu tun?

+0

'PARTITION BY'? Sind Sie sicher, dass Sie MySQL verwenden? –

Antwort

0
select 
    [model], [type], serialNumber, revisionNumber 
    min(case when [name] = 'sensitivity' then [value] end) as sensitivity, 
    min(case when [name] = 'resistance' then [value] end) as resistance 
from T   
group by [model], [type], serialNumber, revisionNumber 
having count(
      case when [name] = 'calibration' then 
       case when convert(date, [value], 105) between @start and @end then 1 end 
      end 
     ) > 0 

Ich SQL Server unter der Annahme, so die Klammern ersetzen mit dem, was für Ihre Plattform geeignet ist. Ich glaube, die verschachtelten case verzögern Versuche, Datumswerte zu übertragen, ohne Fehler zu verursachen.

0

auf SQL Server Sie PIVOT verwenden können, um zu erreichen, was Sie wollen:

SELECT P.model,P.type,P.serialNumber,P.revisionNumber, 
     P.sensitivity,P.resistance,P.calibration 
FROM models D 
    PIVOT (MIN(D.value) FOR D.name IN (sensitivity,resistance,calibration)) AS P 

Grundsätzlich innerhalb der PIVOT-Klausel Sie angeben, dass Sie den Wert Spalte nehmen wollen und breitete sie über Empfindlichkeit, Widerstand und Kalibrierung Spalten .

Der Ausgang erzeugt wird unten dargestellt:

model | type | serialNumber | revisionNumber | sensitivity | resistance | calibration 
A | T1 | 2199 | 5 | 17 | > 100 | 19-04-2016 
B | T1 | 2500 | 5 | 17 | null | null 
+0

Ja, ich habe es versucht, aber es gibt drei Zeilen pro Modell | Typ | Seriennummer | revisionNumber mit Empfindlichkeit und Kalibrierung immer NULL –

+0

Ich habe gerade meine Antwort bearbeitet, ich habe die Ausgabe der Abfrage eingefügt. Meiner Meinung nach ist es genau das, was du brauchst. –

+0

Ich verstehe nicht warum, aber das scheint nicht zu funktionieren. Ich bekomme immer noch zwei Zeilen pro Satz von 'Modell | Seriennummer | revisionNumber' (lässt den Typ für einen Moment aus) und nur die Empfindlichkeitsbedingung liefert Nicht-NULL-Werte 'Modell | Seriennummer | revisionNummer | Empfindlichkeit \t Kalibrierung A | 2199 | 5 | 17.466 | NULL A | 2199 | 5 | NULL | NULL A | 2199 | 6 | 17.466 | NULL " –