[FIXED] Wie kann ich eine Alias-Spalte basierend auf einer Datumsbedingung mit SQL anzeigen?

Ausgabe

Ich habe eine Bibliotheksdatenbank, die ich verwende. Die Datenbank enthält 5 Tabellen, wie unten gezeigt. Ich verwende MS SQL Server Management Studio

Datenbankdiagramm für Bibliotheksdatenbank

Ich zeige derzeit die bookId, den Buchnamen, den Autor des Buches, die Anzahl der Buchseiten und Punkte aus der Buchtabelle mit dem folgenden Code an.

select  
    books.bookId,  
    books.name,  

    authors.surname, 

    types.name, 

    books.pagecount, 
    books.point  
from books 
    join authors 
    on books.authorId = authors.authorId 
    join types 
    on books.typeId = types.typeId 

Ich muss jedoch auch eine Statusspalte von entweder availableoder outbasierend auf der folgenden Logik anzeigen

IF borrows.takenDate < current_timeStamp 
AND borrows.broughtDate = null
THEN display status = Out (in status alias column)
ELSE display status Available (in status alias column)

Diese Logik muss der zuvor im Beitrag erwähnten SQL-Anweisung hinzugefügt werden.

Wie würde ich das in SQL machen?

Vielen Dank für die Hilfe 🙂

Lösung

Da es so aussieht, als wäre Borrows eine assoziative (Verbindungs-)Tabelle zwischen Büchern und Schülern und könnte mehrere Aufzeichnungen von genommen/zurückgegeben haben, sollten Sie das MAXDatum der Aufnahme für jede eindeutige bookId in einer Unterabfrage abrufen und diese mit Ihrer äußeren Abfrage verbinden , können Sie dann eine CASEAnweisung verwenden, um zu prüfen, ob die Unterabfrage bookId null ist, wenn ja, bedeutet dies, dass das Buch verfügbar ist, andernfalls ist es ausgecheckt:

select  
    books.bookId,  
    books.name,  

    authors.surname, 

    types.name, 

    books.pagecount, 
    books.point
    --Use case expression to see if subquery bookId is null on join
    --if so, it's available else it's checked out
    case when t.bookId is null then 'Available' else 'Out' end as [status]
from books 
join authors 
on books.authorId = authors.authorId 
join types 
on books.typeId = types.typeId 
left join --subquery returns bookId's for all books currently checked out
(
    select bookId
    from borrows
    where takenDate < current_timestamp and broughtDate is null
    group by bookId, takenDate
    having takenDate = max(takenDate)   
) as t
on t.bookId = books.bookId


Beantwortet von –
Ryan Wilson


Antwort geprüft von –
David Goodson (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like