AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken SELECT FIRST 1 im JOIN möglich ?

SELECT FIRST 1 im JOIN möglich ?

Ein Thema von MyRealName · begonnen am 14. Sep 2017 · letzter Beitrag vom 14. Nov 2017
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
673 Beiträge
 
Delphi 10.4 Sydney
 
#1

SELECT FIRST 1 im JOIN möglich ?

  Alt 14. Sep 2017, 18:33
Datenbank: Firebird • Version: 3.0 • Zugriff über: UniDAC
Mal ne Frage...

Ich habe eine Tablle "Cp_Fecha" wo ich zu einem Datum einen Preis in einer Lagerposition speichere.

Code:
CREATE TABLE CP_FECHA (
    ITEMID          INTEGER NOT NULL,           -- mein produkt
    LOCATION        CHAR(3) NOT NULL,           -- mein Lager
    FECHA           DATE NOT NULL,              -- Datum
    CP              NUMERIC(15,2) NOT NULL,     -- Mittel-Preis
    QTY_ACUM        FLOAT,
    TOTPARCIAL_ACUM FLOAT
);
Dabei kommt es aber zu Lücken, da man nur ein Register erstellt, wenn es zu einer Änderung kommt. Normalerweise frage ich das dann so ab:

Code:
SELECT FIRST 1 Cp FROM Cp_Fecha WHERE ItemId=:ItemId AND Location=:Loc AND Fecha <= :Fecha ORDER BY Fecha DESCENDING
Könnte man das in ein SELECT als JOIN einbauen oder nur als SubSelect ?
Also Sum Bsp:

Code:
SELECT IA.ItemId, IA.Item, Sum(IA.Qty), CF.CP
FROM ItemAct IA
LEFT JOIN Cp_Fecha CF ON (CP.ItemId=IA.ItemId AND CP.Location=IA.Location AND Fecha <= :Fecha) -- ich weiss, da fehlt was um nur 1 register zu bekommen
anstelle von :
Code:
SELECT IA.ItemId, IA.Item, Sum(IA.Qty),
       (SELECT FIRST 1 Cp FROM Cp_Fecha WHERE ItemId=:ItemId AND Location=:Loc AND Fecha <= :Fecha ORDER BY Fecha DESCENDING) CP
FROM ItemAct IA
Ist das möglich ?

Danke schonma
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: SELECT FIRST 1 im JOIN möglich ?

  Alt 14. Sep 2017, 18:37
Als Derived Table sollte es funktionieren:

SQL-Code:
SELECT
    IA.ItemId, IA.Item, Sum(IA.Qty),
FROM
    ItemAct IA
        join (SELECT FIRST 1 Cp FROM Cp_Fecha WHERE ItemId=:ItemId AND Location=:Loc AND Fecha <= :Fecha ORDER BY Fecha DESCENDING) CP
          on cp.ItemID = IA.ItemID;
Markus Kinzler
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#3

AW: SELECT FIRST 1 im JOIN möglich ?

  Alt 14. Sep 2017, 20:15

Code:
SELECT IA.ItemId, IA.Item, Sum(IA.Qty), CF.CP
FROM ItemAct IA
LEFT JOIN Cp_Fecha CF ON (CP.ItemId=IA.ItemId AND CP.Location=IA.Location AND Fecha <= :Fecha) -- ich weiss, da fehlt was um nur 1 register zu bekommen
Ist das möglich ?
So wie Du es formuliert hast nicht, aber wie Markus es macht, kann man jedes (funktionierende) SQL Statement gegen andere Tabellen oder Statements joinen.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
673 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: SELECT FIRST 1 im JOIN möglich ?

  Alt 14. Sep 2017, 22:02
OK, das hilft. Danke
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
673 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: SELECT FIRST 1 im JOIN möglich ?

  Alt 9. Nov 2017, 16:16
Krame das Thema nochmal hervor. Die Abfrage müsste lauten :

Code:
SELECT
    IA.ItemId, IA.Item, Sum(IA.Qty), MAX(CP1.CP) Costo
FROM
    ItemAct IA
        join (SELECT FIRST 1 Cp, ItemId FROM Cp_Fecha WHERE ItemId=IA.ItemId AND Fecha <= :Fecha ORDER BY Fecha DESCENDING) CP1 on cp1.ItemID = IA.ItemID
GROUP BY IA.ItemId, IA.Item
Aber er sagt, er kenne IA.ItemId nicht.

Gibt es eine Möglichkeit mit SQL das folgende rauszubekomen :

Tabelle Cp_Fecha mit den Feldern ItemId, Fecha (Datum auf spanisch) und CP (Mittelpreis)
Jedesmal wenn der mittelpreis sich ändert, dann wird ein Register geschrieben, max 1 pro tag mit dem letzten Mittelpreis. Manchmal hat man Löcher von Tagen, Wochen und Monaten ohne eine Änderung.


 
ItemId Fecha CP
10 01/01/2017 3.50
10 05/01/2017 3.80
10 30/01/2017 3.60
105 02/01/2017 45.30
105 12/01/2017 46.00
105 03/02/2017 46.10
544 02/01/2017 5.63
544 07/01/2017 6.12

Jetzt will ich den Preis eines jeden Produktes, also 10, 105 und 544) zum 06/01/2017 wissen. Die Abfrage sollte den Preis zum Tag oder den nächst vorherigen nehmen. Im Fall des Produktes 10 den vom 05/01/2017.

Ideen ?
  Mit Zitat antworten Zitat
Towmuz

Registriert seit: 21. Sep 2016
Ort: Minden
127 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6

AW: SELECT FIRST 1 im JOIN möglich ?

  Alt 9. Nov 2017, 16:35
Hi,

das sollte mit
Code:
with recursive
gut funktionieren.

FireBird-Doku
Obwohl das Beispiel sicherlich Geschmackssache ist, mit google kommste da aber auch schnell weiter.
Thomas
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#7

AW: SELECT FIRST 1 im JOIN möglich ?

  Alt 9. Nov 2017, 16:54
Aber er sagt, er kenne IA.ItemId nicht.
Ja und kennen wir IA bzw den Tabellenaufbau von IA? Offenbar gibt es in der Tabelle dieses Feld ItemID nicht. Das Subselect für den nächst kleineren Wert mit neuestem Mittelwert sollte schon passen. Aber joinen ohne passende ID geht halt nicht.

Ob with recursive da hilft, würde ich auf die Schnelle bezweifeln, denn es fehlt ja eben ein konkreter (also passender) join Wert.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
673 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: SELECT FIRST 1 im JOIN möglich ?

  Alt 9. Nov 2017, 16:57
IA (also ItemAct) hat ein Feld ItemId, das sollte nicht das Problem sein

Hier die genauen Strukturen :

Code:
CREATE TABLE CP_FECHA (
    ITEMID          INTEGER NOT NULL,
    LOCATION        CHAR(3) NOT NULL,
    FECHA           DATE NOT NULL,
    CP              NUMERIC(15,2) NOT NULL,
    QTY_ACUM        FLOAT,
    TOTPARCIAL_ACUM FLOAT
);

CREATE TABLE ITEMACT (
    CONTEO         INTEGER NOT NULL,
    LOCATION       CHAR(3) NOT NULL,
    ITEM           CHAR(15) NOT NULL,
    ID_N           BIGINT,
    TIPO           CHAR(2),
    BATCH          INTEGER,
    FECHA          DATE,
    QTY            NUMERIC(15,5),
    VALUNIT        NUMERIC(15,2),
    VALCDCT        NUMERIC(15,2),
    VALCFLE        NUMERIC(15,2),
    QTYB           NUMERIC(15,2),
    E              SMALLINT,
    S              SMALLINT,
    LOTE           CHAR(20),
    TOTPARCIAL     NUMERIC(15,2),
    PRIORIDAD      INTEGER,
    COLOR          CHAR(25),
    COD_TALLA      CHAR(5),
    PRECIO         NUMERIC(15,2),
    COSTP_KARDEX   NUMERIC(15,2) DEFAULT 0,
    SALDO_KARDEX   NUMERIC(15,2) DEFAULT 0,
    SALDODU_KARDEX NUMERIC(15,2) DEFAULT 0,
    PARCIAL_KARDEX NUMERIC(15,2) DEFAULT 0,
    TOTAL_KARDEX   NUMERIC(15,2) DEFAULT 0,
    COD_LISTA      INTEGER DEFAULT -1,
    COSTO_PROMEDIO TNUMERICO DEFAULT 0 /* TNUMERICO = NUMERIC(15,2) DEFAULT 0 */,
    ER             INTEGER,
    SR             INTEGER,
    TIPOR          CHAR(2),
    NUMEROR        INTEGER,
    HORA           DATE,
    FCH_VNCMNTO    DATE,
    ID_CURVA       INTEGER,
    ID_LOTE        INTEGER,
    ITEMID         INTEGER,
    AUX            INTEGER,
    DOCID          BIGINT NOT NULL
);
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#9

AW: SELECT FIRST 1 im JOIN möglich ?

  Alt 9. Nov 2017, 17:02

SQL-Code:
..
    ItemAct IA
        join (SELECT FIRST 1 Cp, ItemId FROM Cp_Fecha WHERE ItemId=IA.ItemId AND Fecha <= :Fecha ORDER BY Fecha DESCENDING) CP1 on cp1.ItemID = IA.ItemID
...
==>
SELECT FIRST 1 Cp, ItemId
FROM Cp_Fecha
WHERE ItemId=IA.ItemId AND ....
Auch in einer Unterabfrage sollten in FROM alle Tabellen definiert werden, die in WHERE angesprochen werden.

Gruß
K-H

P.S. ggf ist es einfacher für jedes Produkt den Datensatz auszugeben, der die Datumsbedingung erfüllt. So lange es gerade mal eine gute Hand voll Produkte ist...
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#10

AW: SELECT FIRST 1 im JOIN möglich ?

  Alt 9. Nov 2017, 17:15
Achso gar nicht gesehen, im Join select wird bereist der Alias IA verwendet. Ist da noch unbekannt, also hier " WHERE ItemId=IA.ItemId" muss das raus und in den "On" Teil des join als Kriterium und ItemID muss natürlich vom Subselect ausgegeben werden.

P.S:
Ich merke gerade, dass mach so keinen Sinn. Das Beispiel von Markus enthält ja diese Bedingung als Parameter. Die Gesamtmenge auf diese Weise abzufragen ist mit der Kombi first 1 natürlich unzureichend.
Gruß, Jo

Geändert von jobo ( 9. Nov 2017 um 17:21 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz