# SQL zwei Zellen aus gleicher Tabelle subtrahieren



## pette (25. Januar 2014)

Hallo,

ich bin neu in die welt der SQL Abfragen eingestiegen und stehe vor einem Problem. Ich hatte gehofft, dass einer von euch mir helfen kann.
Ich habe eine Abfrage die so aussieht, aber nicht funktioniert. Kann mir helfen es zum funktionieren zu bringen.

Abfrage: Select Spalte1 from Tabelle1 where Bedingung minus Select Spalte2 from Tabelle1 where Bedingung 

Vielen Dank und Grüße

Pette


----------



## Yaslaw (26. Januar 2014)

MINUS gibts nicht.

Mit dem abstrakten SQL von dr kann ich dir nicht weiterhelfen. Poste das Richtige SQL.


----------



## pette (26. Januar 2014)

Ja entschuldige, also hier der richtige code:


Select currentServiceHours from device where assignedRole='Channel1' minus select lastServiceHours from device where assigendRole='Channel1'


----------



## Yaslaw (26. Januar 2014)

Als erstes brungt man ein SQL-Code in eine lesbare Form. inzeiler sind nicht geeignet

```
SELECT currentservicehours 
FROM device 
WHERE assignedrole = 'Channel1' 
MINUS 
SELECT lastservicehours 
FROM device 
WHERE assigendrole = 'Channel1'
```


Mit einem LEFT JOIN und Prüfung auf NULL gehts auch

```
SELECT
    d1.currentservicehours
FROM
    device AS d1
    LEFT JOIN device AS d2
        ON d1.currentservicehours = d2.lastservicehours 
WHERE
    d2.lastservicehours IS NULL
```


----------



## pette (26. Januar 2014)

vielen dank, aber irgendwie schein ich ein Verständnisproblem zu haben. Jetzt berechnet er die Spalte currentservicehours und lastservicehours der ganzen Tabelle, oder? Würde es auch nur von einer Zeile gehen?
Sorry für mein nicht-wissen :/


----------



## Yaslaw (26. Januar 2014)

Stimmt, Du musst noch die 2 WHERE- Teile hinzufügen. Hab ich vergessen.

Es geht in einer Zeile, Sieh selber und sag dann, was lesbarer ist (Lesbar = man macht weniger Fehler)
PHP SQL-Statement in PHP lesbar darstellen


```
SELECT d1.currentservicehours FROM device AS d1 LEFT JOIN device AS d2 ON d1.currentservicehours = d2.lastservicehours AND d1.assigendrole = d2.assigendrole WHERE d2.lastservicehours IS NULL AND d1.assigendrole = 'Channel1'
```


```
SELECT
    d1.currentservicehours
FROM
    device AS d1
    LEFT JOIN device AS d2
        ON d1.currentservicehours = d2.lastservicehours 
        AND d1.assigendrole = d2.assigendrole
WHERE
    d2.lastservicehours IS NULL
    AND d1.assigendrole = 'Channel1'
```


----------



## pette (26. Januar 2014)

Okay, du hast vollkommen recht  so ist es schon besser zu lesen.

Aber jetzt scheint er den wert von currentservicehours auszugeben. Der Wert von currentservicehours ist 1398 und von lastservicehours sind 1275, also sollte es 123 sein.
Als Ergebnis bringt er aber 1398.


----------



## Yaslaw (26. Januar 2014)

Achso, du willst die Werte abziehen!
So wie dein erstes Query war, ist bei Oracle die EIne Menge an Zeilen minus die andere Menge.

Geschätzt so. Aber welche Felder für den JOIN gebraucht werden, habe ich geraten.

```
SELECT
    d1.currentservicehours - d2.lastServiceHours
FROM
    device AS d1
    INNER JOIN device AS d2
        ON  d1.assigendrole = d2.assigendrole
WHERE
    d1.assigendrole = 'Channel1'
```

Ich rate dir dringend, dich mit der Dokumentatoin zu SQL auseinanderzusetzen. Was du haben willst, ist die leichteste Übung für eine Abfrage mit 2 Tabellen!


----------



## pette (27. Januar 2014)

super! Jetzt hat es geklappt. 
Ich werde mich in nächster Zeit wohl intensiver damit beschäftigen. Danke für den Rat!


----------

