Frage

Business-Welt 1256987 monatlich 10 2009-10-28

Business-Welt 1256987 monatlich 10 2009-09-23

Business-Welt 1256987 monatlich 10 2009-08-18

Linux 4 U 456734 monatlichen 25 2009-12-24

Linux 4 U 456734 monatlichen 25 2009-11-11

Linux 4 U 456734 monatlichen 25 2009-10-28


Ich bekomme dieses Ergebnis mit der Abfrage:

SELECT DISTINCT ljm.journelname,ljm. subscription_id,
    ljm.frequency,ljm.publisher, ljm.price, ljd.receipt_date 
FROM lib_journals_master ljm,
    lib_subscriptionhistory 
    lsh,lib_journal_details ljd 
WHERE ljd.journal_id=ljm.id 
ORDER BY ljm.publisher

Was ich brauche, ist das neueste Datum in jedem journal?

Ich habe versucht, diese Abfrage:

SELECT DISTINCT ljm.journelname, ljm.subscription_id,
    ljm.frequency, ljm.publisher, ljm.price,ljd.receipt_date
FROM lib_journals_master ljm,
    lib_subscriptionhistory lsh,
    lib_journal_details ljd
WHERE ljd.journal_id=ljm.id 
AND ljd.receipt_date = (
    SELECT max(ljd.receipt_date) 
    from lib_journal_details ljd)

Aber es gibt mir die maximale von die gesamte Spalte.Mein gewünschte Ergebnis haben zwei Termine (maximal jedes Magazin), aber diese Abfrage gibt mir nur ein?

War es hilfreich?

Lösung

Sie sollten Gruppierung verwenden, wenn Sie die Max von Datum brauchen. Sollte wie folgt aussehen:

SELECT 
   ljm.journelname
   , ljm.subscription_id
   , ljm.frequency
   , ljm.publisher
   , ljm.price
   , **MAX(ljd.receipt_date)**
FROM 
   lib_journals_master ljm
   , lib_subscriptionhistory lsh
   , lib_journal_details ljd
WHERE 
   ljd.journal_id=ljm.id 
GROUP BY 
   ljm.journelname
   , ljm.subscription_id
   , ljm.frequency
   , ljm.publisher
   , ljm.price

Andere Tipps

Sie könnte sich ändern, die WHERE-Anweisung zu suchen, bis das Letzte Datum für jedes journal:

AND ljd.receipt_date = (
    SELECT max(subljd.receipt_date) 
    from lib_journal_details subljd
    where subljd.journelname = ljd.journelname)

Achten Sie darauf, geben Sie die Tabelle in der Unterabfrage einen anderen alias aus der Tabelle in der hauptabfrage.

So etwas sollte für Sie arbeiten.

SELECT ljm.journelname
       , ljm.subscription_id
       , ljm.frequency
       , ljm.publisher
       , ljm.price
       ,md.max_receipt_date
FROM lib_journals_master ljm
    , (    SELECT journal_id
            , max(receipt_date) as max_receipt_date
           FROM lib_journal_details 
           GROUP BY journal_id) md
WHERE ljm.id = md.journal_id
/

Beachten Sie, dass ich die Tabellen aus der FROM-Klausel entfernt haben, die nichts auf die Abfrage bei. Sie können sie ersetzen müssen, wenn yopu Ihr Szenario zu unserem Nutzen vereinfacht.

Trennen Sie diese in zwei Abfragen wird ein Journalnamen und aktuelle Datum

erhalten
declare table @table (journalName as varchar,saleDate as datetime)

insert into @table
select journalName,max(saleDate) from JournalTable group by journalName

Wählen Sie alle Felder, die Sie von Ihrem Tisch brauchen und kommen @table mit ihnen. kommen auf journalName.

Klingt wie Anfang der Gruppe. Sie können mit einem CTE in SQL Server:


;WITH journeldata AS
(
SELECT 
     ljm.journelname
    ,ljm.subscription_id
    ,ljm.frequency
    ,ljm.publisher
    ,ljm.price
    ,ljd.receipt_date
    ,ROW_NUMBER() OVER (PARTITION BY ljm.journelname ORDER BY ljd.receipt_date DESC) AS RowNumber
FROM 
     lib_journals_master ljm
    ,lib_subscriptionhistory lsh
    ,lib_journal_details ljd 
WHERE 
    ljd.journal_id=ljm.id
    AND ljm.subscription_id = ljm.subscription_id
)
SELECT
     journelname
    ,subscription_id
    ,frequency
    ,publisher
    ,price
    ,receipt_date
FROM journeldata
WHERE RowNumber = 1 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top