![]() |
| | Themen-Optionen | Thema durchsuchen |
| | Nach oben #1 |
| Benutzer Registriert seit: 18.08.2005 Ort: Düsseldorf
Beiträge: 57
|
Da ich gerade an einer kleinen Query rumgedoktert habe, die mir einigen PHP-Code abnehmen soll .. entstand dieses dieses Machwerk: Code:
UPDATE auftraege,
(
SELECT auftragsid
,SUBSTRING(
GROUP_CONCAT(positionen.artikelgruppe ORDER BY artikel_wert.wert DESC)
,1
,LOCATE(',', GROUP_CONCAT(positionen.artikelgruppe ORDER BY artikel_wert.wert DESC)) - 1
) as gruppe
FROM positionen
INNER JOIN artikel_wert
ON positionen.artikelgruppe = artikel_wert.gruppe
GROUP
BY positionen.auftragsid ASC
) AS pos
SET auftraege.artikelgruppe = pos.gruppe
WHERE auftraege.id = pos.auftragsid
;
> `positionen` enthält mehrere einträge zu einem Auftrag > Eine der Positionen gilt als "Hauptartikel" > Bestimmt wird der Hauptartikel über `artikel_wert` > Dort ist z.b. für ein 'Bett' die Wertigkeit 100 hinterlegt, ein 'Tisch' kommt nur auf 90. > 'Tisch' und 'Bett' sind Werte, die in `positionen.artikelgruppe` wiederzufinden sind. > Die Artikelgruppe des Hauptartikel soll dem Auftrag zugesprochen werden. Was bei den knapp 2.000 Aufträgen im System derzeit nicht hinterlegt war. Die Query löst das in einem Rutsch. Ich meine .. es ist nicht das längste, aber das perverseste Stück Abfrage, das mir bislang aus den Fingern kam ... |
| | |
| | Nach oben #7 | |
| Benutzer Registriert seit: 18.08.2005 Ort: Düsseldorf
Beiträge: 57
| Zitat:
Und wo ich dann die Subquery unterzubringen hatte, war nicht ganz so flott rauszubekommen. Insgesamt hats mit wohl an die Stunde Arbeit gekostet, ber nun bin auch wieder imens schlauer als zuvor ^^ | |
| | |
| | Nach oben #9 | |
| Benutzer Registriert seit: 15.02.2005
Beiträge: 33
| Zitat:
Au Mann, was soll ich da erst sagen oder besser schreiben!? Meine längsten Abfragen haben schon locker an die 60-Zeilen und mehr erreicht. Dagegen ist dein "Trum" ja ein Witz.
__________________ No Sig | |
| | |
| | Nach oben #10 | |
| Jann Hendrik Bekaan Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 2.467
| Zitat:
__________________ Umfragen: Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Danke! | |
| | |
| | Nach oben #11 | |
| Benutzer Registriert seit: 15.02.2005
Beiträge: 33
| Zitat:
Code: ..
OPEN io_cur
FOR
SELECT distinct(nh.iidentif_snr) AS hre_id,
decode(o.ihierarch_stu, 1, o.ccode1, 2, o.ccode2) AS geb_nr,
nh.ccode2 AS etage,
nh.ccode5 AS raum,
(select hre.cbez1
from nhreinhe hre
where hre.iidentif_snr = (SELECT ifid_vati
FROM nhreinhe
START WITH iidentif_snr = nh.iidentif_snr
CONNECT BY PRIOR iidentif_snr = ifid_vati)) AS raumbezeichnung,
nh.cbez1 AS raumzonenbez,
nvl(gf.ccode1,'') AS na,
nvl(gf.cbez1,'') AS hnf_bez,
nvl(gf.cbez2,'') AS rna,
ac_flaeuml.GET_NA_MA(nh.iidentif_snr) AS NA_MA,
ac_flaeuml.GET_MA(nh.iidentif_snr) AS MA,
ac_flaeuml.GET_FLAE_ZUO(nh.iidentif_snr) AS flae_zuo,
no.cbez1 AS vermieter,
no.ccode1 AS vermieter_wkz,
gk.ccode1 AS vermieter_kst,
ac_flaeuml.GET_MIETER(nh.iidentif_snr) AS mieter,
ac_flaeuml.GET_MIET_KST(nh.iidentif_snr) AS miet_kst,
ac_flaeuml.GET_MIETER_WKZ(nh.iidentif_snr) AS mieter_wkz,
round(nh.rflaeche,2) AS flaeche,
round(ac_flaeuml.GET_UML_FLAE(nh.iidentif_snr, o.iidentif_snr, nh.rflaeche),2) AS uml_flae,
round(ac_flaeuml.GET_MIET_FLAE(nh.iidentif_snr, o.iidentif_snr, nh.rflaeche),2) AS miet_flae,
ac_flaeuml.GET_MKA(nh.iidentif_snr) AS mka,
ac_flaeuml.GET_MKA_CBEZ2(nh.iidentif_snr) AS mka_cbez2,
ac_flaeuml.GET_MKA_CBEZ1(nh.iidentif_snr) AS mka_cbez1,
round(ac_flaeuml.GET_MIETPREIS(nh.iidentif_snr, o.iidentif_snr, nh.rflaeche),2) AS mietpreis,
-- round(ac_flaeuml.GET_MONATSMIETE(nh.iidentif_snr, o.iidentif_snr, nh.rflaeche),2) AS monatsmiete,
round(ac_flaeuml.GET_MONATSMIETE(nh.iidentif_snr, o.iidentif_snr, nh.rflaeche)+round(ac_flaeuml.GET_MONATSMIETE(nh.iidentif_snr, o.iidentif_snr, nh.rflaeche)-round(ac_flaeuml.GET_MONATSMIETE(nh.iidentif_snr, o.iidentif_snr, nh.rflaeche),3),3),2) AS monatsmiete,
-- round(ac_flaeuml.GET_MONATSMIETE(nh.iidentif_snr, o.iidentif_snr, nh.rflaeche)*12+round(ac_flaeuml.GET_MONATSMIETE(nh.iidentif_snr, o.iidentif_snr, nh.rflaeche)*12-round(ac_flaeuml.GET_MONATSMIETE(nh.iidentif_snr, o.iidentif_snr, nh.rflaeche)*12,3),3),2) AS jahresmiete,
decode(ac_flaeuml.EXISTS_SONDERMIETE(nh.iidentif_snr), 0, round(ac_flaeuml.GET_MONATSMIETE(nh.iidentif_snr, o.iidentif_snr, nh.rflaeche)*12,2), 1, ac_flaeuml.GET_ROUNDED_JM(nh.iidentif_snr, o.iidentif_snr, nh.rflaeche) ) AS jahresmiete,
-- round(ac_flaeuml.GET_MONATSMIETE(nh.iidentif_snr, o.iidentif_snr, nh.rflaeche)*12,2) AS jahresmiete,
round(ac_flaeuml.GET_SONDERMIETE(nh.iidentif_snr),2) AS sondermiete,
decode(ac_flaeuml.GET_ZA(nh.iidentif_snr),12.0,'J',6.0,'H',3.0,'Q',1.0,'M',-1.0,'') AS za,
ac_flaeuml.GET_UML_ANTEIL(o.iidentif_snr) AS umlagefaktor
FROM zobjcost zoc,
nobjekt o,
norganis no,
gkostel gk,
nhreinhe nh,
gflart1 gf
where o.iidentif_snr IN (
select iidentif_snr
from nobjekt
where ihierarch_stu = 2
START WITH iidentif_snr = i_keynr
CONNECT BY PRIOR iidentif_snr = ifid_vati)
and nh.ifnobje_super = o.iidentif_snr
and gk.iidentif_snr = zoc.ifgkostid_tab
and gk.ifnorga_super = no.iidentif_snr
and nh.ihierarch_stu = 6
and nh.IFGNUTZID_TAB = gf.iidentif_snr(+)
order by 2,15,4,6,8;
--
-- alle sonstigen Fälle ...
--
ELSE
OPEN io_cur
...
__________________ No Sig | |
| | |
| | Nach oben #13 | |
| Benutzer Registriert seit: 15.02.2005
Beiträge: 33
| Zitat:
Nee, aber im Ernst, das sind so übliche Sachen, mit denen ich mich u.a. herumschlagen darf. Das ganze Package (inkl. der zitierten SELECT-Abfrage) hat fast 2200 Zeilen an Code.
__________________ No Sig | |
| | |
| | Nach oben #16 | |
| Benutzer Registriert seit: 15.02.2005
Beiträge: 33
| Zitat:
Aber das ist dann schon wieder ein ganz anderes Thema.
__________________ No Sig | |
| | |
| | Nach oben #18 |
| Martin Eisengardt Registriert seit: 30.03.2006 Ort: Pfinztal
Beiträge: 352
|
Den kann ich über, den kann ich über.... Und das ist einer meiner einfachsten Code: SELECT
Zuordnung.NR_PROFIL_ID,
Zuordnung.Profilart,
Zuordnung.NR_FKT_ID,
Zuordnung.NR_AUFTRAG,
Zuordnung.SL_AENDERUNG AS ZuordAend,
Zuordnung.WRT_TS_AEND AS ZuordTSAend,
AttWertebereich.NR_ATTRIBUT_ID,
AttWertebereich.AttAuftrag,
AttWertebereich.AttAenderung,
AttWertebereich.AttTSAenderung,
AttWertebereich.KZ_ZULAESSIG,
AttWertebereich.SL_WB_TYP,
AttWertebereich.WRT_INHALT_WB,
AttWertebereich.WbAuftrag,
AttWertebereich.WbAenderung,
AttWertebereich.WbTSAenderung
FROM
(
SELECT
ZuordStd.NR_PROFIL_ID,
'S' AS Profilart,
ZuordStd.NR_FKT_ID,
0 AS NR_AUFTRAG,
0 AS SL_AENDERUNG,
ZuordStd.WRT_TS_AEND
FROM
(
SELECT
NR_PROFIL_ID,
NR_FKT_ID,
MAX(WRT_TS_AEND) AS WRT_TS_AEND
FROM T00.VNPT1045
WHERE NR_PROFIL_ID IN (10001, 10004, 10005, 10008, 10010, 10013, 10014, 10020)
GROUP BY NR_PROFIL_ID,
NR_FKT_ID
) AS tmp0
INNER JOIN
T00.VNPT1045 ZuordStd
ON tmp0.NR_PROFIL_ID=ZuordStd.NR_PROFIL_ID
AND tmp0.NR_FKT_ID=ZuordStd.NR_FKT_ID
AND tmp0.WRT_TS_AEND=ZuordStd.WRT_TS_AEND
WHERE ZuordStd.SL_AENDERUNG <> 4
UNION
SELECT
COALESCE(ZuordBankP.NR_PROFIL_ID, ZuordBankH.NR_PROFIL_ID) AS NR_PROFIL_ID,
'B' AS Profilart,
COALESCE(ZuordBankP.NR_FKT_ID, ZuordBankH.NR_FKT_ID) AS NR_FKT_ID,
COALESCE(ZuordBankP.NR_AUFTRAG, 0) AS NR_AUFTRAG,
COALESCE(ZuordBankP.SL_AENDERUNG, 0) AS SL_AENDERUNG,
COALESCE(ZuordBankP.WRT_TS_AEND, ZuordBankH.WRT_TS_FREIGABE) AS WRT_TS_AEND
FROM
(
SELECT
Planung.NR_PROFIL_ID,
Planung.NR_AUFTRAG,
Planung.NR_FKT_ID,
Planung.SL_AENDERUNG,
Planung.WRT_TS_AEND
FROM T00.VNPT1030 Planung
WHERE Planung.RZBK = 8844
AND Planung.NR_PROFIL_ID IN (10001, 10004, 10005, 10008, 10010, 10013, 10014, 10020)
)
ZuordBankP
FULL OUTER JOIN
(
SELECT
Historie.NR_PROFIL_ID,
Historie.NR_AUFTRAG,
Historie.NR_FKT_ID,
Historie.SL_AENDERUNG,
Historie.WRT_TS_FREIGABE
FROM
(
SELECT
*
FROM T00.VNPT1044
WHERE RZBK = 8844
)
Historie
INNER JOIN
(
SELECT
RZBK,
NR_PROFIL_ID,
NR_FKT_ID,
MAX(WRT_TS_FREIGABE) WRT_TS_FREIGABE
FROM T00.VNPT1044
WHERE RZBK = 8844
AND NR_PROFIL_ID IN (10001, 10004, 10005, 10008, 10010, 10013, 10014, 10020)
GROUP BY RZBK,
NR_PROFIL_ID,
NR_FKT_ID
)
tmp1
ON Historie.RZBK=tmp1.RZBK
AND Historie.NR_PROFIL_ID=tmp1.NR_PROFIL_ID
AND Historie.NR_FKT_ID=tmp1.NR_FKT_ID
AND Historie.WRT_TS_FREIGABE=tmp1.WRT_TS_FREIGABE
WHERE Historie.SL_AENDERUNG<>4
)
ZuordBankH
ON ZuordBankP.NR_PROFIL_ID = ZuordBankH.NR_PROFIL_ID
AND ZuordBankP.NR_FKT_ID = ZuordBankH.NR_FKT_ID
)
Zuordnung
LEFT OUTER JOIN
(
SELECT
Attribut.NR_PROFIL_ID,
Attribut.NR_FKT_ID,
Attribut.NR_ATTRIBUT_ID,
Attribut.SL_AENDERUNG AS AttAenderung,
Attribut.WRT_TS_AEND AS AttTSAenderung,
Attribut.NR_AUFTRAG AS AttAuftrag,
Wertebereich.KZ_ZULAESSIG,
Wertebereich.SL_WB_TYP,
Wertebereich.WRT_INHALT_WB,
Wertebereich.NR_AUFTRAG AS WbAuftrag,
Wertebereich.SL_AENDERUNG AS WbAenderung,
Wertebereich.WRT_TS_AEND AS WbTSAenderung
FROM
(
SELECT
COALESCE(ZuordAttP.NR_PROFIL_ID, ZuordAttH.NR_PROFIL_ID) AS NR_PROFIL_ID,
COALESCE(ZuordAttP.NR_FKT_ID, ZuordAttH.NR_FKT_ID) AS NR_FKT_ID,
COALESCE(ZuordAttP.NR_ATTRIBUT_ID, ZuordAttH.NR_ATTRIBUT_ID) AS NR_ATTRIBUT_ID,
COALESCE(ZuordAttP.SL_AENDERUNG, 0) AS SL_AENDERUNG,
COALESCE(ZuordAttP.WRT_TS_AEND, ZuordAttH.WRT_TS_FREIGABE) AS WRT_TS_AEND,
COALESCE(ZuordAttP.NR_AUFTRAG, ZuordAttH.NR_AUFTRAG) AS NR_AUFTRAG
FROM
(
SELECT
Planung.NR_PROFIL_ID,
Planung.NR_FKT_ID,
Planung.NR_ATTRIBUT_ID,
Planung.SL_AENDERUNG,
Planung.WRT_TS_AEND,
Planung.NR_AUFTRAG
FROM T00.VNPT1036 Planung
WHERE Planung.RZBK = 8844
AND Planung.NR_STELLEN_ID = 0
AND Planung.NR_PROFIL_ID IN (10001, 10004, 10005, 10008, 10010, 10013, 10014, 10020)
)
ZuordAttP
FULL OUTER JOIN
(
SELECT
Historie.NR_PROFIL_ID,
Historie.NR_FKT_ID,
Historie.NR_ATTRIBUT_ID,
Historie.SL_AENDERUNG,
Historie.WRT_TS_FREIGABE,
Historie.NR_AUFTRAG
FROM
(
SELECT
*
FROM T00.VNPT1052
WHERE RZBK = 8844
)
Historie
INNER JOIN
(
SELECT
RZBK,
NR_PROFIL_ID,
NR_FKT_ID,
NR_ATTRIBUT_ID,
MAX(WRT_TS_FREIGABE) WRT_TS_FREIGABE
FROM T00.VNPT1052
WHERE RZBK = 8844
AND NR_STELLEN_ID = 0
AND NR_PROFIL_ID IN (10001, 10004, 10005, 10008, 10010, 10013, 10014, 10020)
GROUP BY RZBK,
NR_PROFIL_ID,
NR_FKT_ID,
NR_ATTRIBUT_ID
)
tmp2
ON Historie.RZBK=tmp2.RZBK
AND Historie.NR_PROFIL_ID=tmp2.NR_PROFIL_ID
AND Historie.NR_FKT_ID=tmp2.NR_FKT_ID
AND Historie.NR_ATTRIBUT_ID=tmp2.NR_ATTRIBUT_ID
AND Historie.WRT_TS_FREIGABE=tmp2.WRT_TS_FREIGABE
WHERE Historie.SL_AENDERUNG<>4
)
ZuordAttH
ON ZuordAttP.NR_PROFIL_ID = ZuordAttH.NR_PROFIL_ID
AND ZuordAttP.NR_FKT_ID = ZuordAttH.NR_FKT_ID
AND ZuordAttP.NR_ATTRIBUT_ID = ZuordAttH.NR_ATTRIBUT_ID
)
Attribut
INNER JOIN
(
SELECT
COALESCE(AttWbP.NR_PROFIL_ID, AttWbH.NR_PROFIL_ID) AS NR_PROFIL_ID,
COALESCE(AttWbP.NR_FKT_ID, AttWbH.NR_FKT_ID) AS NR_FKT_ID,
COALESCE(AttWbP.NR_ATTRIBUT_ID, AttWbH.NR_ATTRIBUT_ID) AS NR_ATTRIBUT_ID,
COALESCE(AttWbP.NR_AUFTRAG, AttWbH.NR_AUFTRAG) AS NR_AUFTRAG,
COALESCE(AttWbP.KZ_ZULAESSIG, AttWbH.KZ_ZULAESSIG) AS KZ_ZULAESSIG,
COALESCE(AttWbP.SL_WB_TYP, AttWbH.SL_WB_TYP) AS SL_WB_TYP,
COALESCE(AttWbP.WRT_INHALT_WB, AttWbH.WRT_INHALT_WB) AS WRT_INHALT_WB,
COALESCE(AttWbP.SL_AENDERUNG, 0) AS SL_AENDERUNG,
COALESCE(AttWbP.WRT_TS_AEND, AttWbH.WRT_TS_FREIGABE) AS WRT_TS_AEND
FROM
(
SELECT
Planung.NR_PROFIL_ID,
Planung.NR_FKT_ID,
Planung.NR_ATTRIBUT_ID,
Planung.NR_AUFTRAG,
Planung.KZ_ZULAESSIG,
Planung.SL_WB_TYP,
Planung.WRT_INHALT_WB,
Planung.SL_AENDERUNG,
Planung.WRT_TS_AEND
FROM T00.VNPT1037 Planung
WHERE Planung.RZBK = 8844
AND Planung.NR_STELLEN_ID = 0
AND Planung.NR_PROFIL_ID IN (10001, 10004, 10005, 10008, 10010, 10013, 10014, 10020)
)
AttWbP
FULL OUTER JOIN
(
SELECT
Historie.NR_PROFIL_ID,
Historie.NR_FKT_ID,
Historie.NR_ATTRIBUT_ID,
Historie.NR_AUFTRAG,
Historie.KZ_ZULAESSIG,
Historie.SL_WB_TYP,
Historie.WRT_INHALT_WB,
Historie.SL_AENDERUNG,
Historie.WRT_TS_FREIGABE
FROM
(
SELECT
*
FROM T00.VNPT1053
WHERE RZBK = 8844
)
Historie
INNER JOIN
(
SELECT
RZBK,
NR_PROFIL_ID,
NR_FKT_ID,
NR_ATTRIBUT_ID,
MAX(WRT_TS_FREIGABE) WRT_TS_FREIGABE
FROM T00.VNPT1053
WHERE RZBK = 8844
AND NR_STELLEN_ID = 0
AND NR_PROFIL_ID IN (10001, 10004, 10005, 10008, 10010, 10013, 10014, 10020)
GROUP BY RZBK,
NR_PROFIL_ID,
NR_FKT_ID,
NR_ATTRIBUT_ID
)
tmp3
ON Historie.RZBK=tmp3.RZBK
AND Historie.NR_PROFIL_ID=tmp3.NR_PROFIL_ID
AND Historie.NR_FKT_ID=tmp3.NR_FKT_ID
AND Historie.NR_ATTRIBUT_ID=tmp3.NR_ATTRIBUT_ID
AND Historie.WRT_TS_FREIGABE=tmp3.WRT_TS_FREIGABE
WHERE Historie.NR_STELLEN_ID = 0
AND Historie.SL_AENDERUNG<>4
)
AttWbH
ON AttWbP.NR_PROFIL_ID = AttWbH.NR_PROFIL_ID
AND AttWbP.NR_FKT_ID = AttWbH.NR_FKT_ID
AND AttWbP.NR_ATTRIBUT_ID = AttWbH.NR_ATTRIBUT_ID
)
Wertebereich
ON Attribut.NR_PROFIL_ID = Wertebereich.NR_PROFIL_ID
AND Attribut.NR_FKT_ID = Wertebereich.NR_FKT_ID
AND Attribut.NR_ATTRIBUT_ID = Wertebereich.NR_ATTRIBUT_ID
)
AttWertebereich
ON Zuordnung.NR_PROFIL_ID = AttWertebereich.NR_PROFIL_ID
AND Zuordnung.NR_FKT_ID = AttWertebereich.NR_FKT_ID
ORDER BY 1,
3,
7
|
| | |
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | Thema durchsuchen |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| query umschreiben | nibblas | Datenbanken | 5 | 04.07.2007 16:41 |
| PDO Query limit | ex³ | PHP-Programmierung | 3 | 10.03.2007 08:37 |
| Auslesen zweier verschiedener Datensätze in einem Query (mySQL) | Chr!s | Datenbanken | 8 | 14.11.2006 19:57 |
| MySQL Fehlermeldung: Your query requires a full tablescan ... | Chr!s | Datenbanken | 12 | 31.07.2006 21:45 |
| Query verbessern? | björn | Datenbanken | 4 | 05.06.2006 13:48 |