https://cust-projects.seeburger.de/redmine/issues/20874
SUM(Quantity) OVER (PARTITION BY AccountID ORDER BY ID) würde wahrscheinlich tun (Link)SELECT CNCRHEADERID, CSNOPOSNR, cSERIALNO, SUM( LENGTH(cSERIALNO) + 1 ) OVER ( partition BY CNCRHEADERID ORDER BY CSNOPOSNR ASC ) cTotalLen FROM TAIRNCR_SERIALNO
Mein jetziges SQL:
SELECT tAirPartnerRelation.*, tAirOrderingOfficer.*, TAIRMATERIAL.*, TAIRNCRHEADER.*, serial.* FROM TAIRNCRHEADER INNER JOIN tAirPartnerRelation ON TAIRNCRHEADER.CREFRELATIONID = tAirPartnerRelation.CRELATIONID INNER JOIN tAirOrderingOfficer ON TAIRNCRHEADER.CREFOFFICERID = tAirOrderingOfficer.CORDERINGOFFICERID INNER JOIN TAIRMATERIAL ON TAIRNCRHEADER.CREFMATID = TAIRMATERIAL.CMATERIALID LEFT JOIN (SELECT CNCRHEADERID serialHeaderId, CSERIALNO CSERIALNUM FROM (SELECT CNCRHEADERID, CASE WHEN CNT <= 100 THEN cSERIALNO ELSE (CASE WHEN CSERIALNO IS NOT NULL THEN CSERIALNO||'...' ELSE CSERIALNO END) END cSerialNo FROM (SELECT COUNT(*) AS cnt, CNCRHEADERID, LISTAGG(CASE WHEN ROWNUM <= 100 THEN CSERIALNO END, ';') WITHIN GROUP (ORDER BY CSNOPOSNR) AS CSERIALNO FROM TAIRNCR_SERIALNO GROUP BY CNCRHEADERID))) serial ON TAIRNCRHEADER.CNCRHEADERID=serial.serialHeaderId WHERE 1 = 1 AND ROWNUM <= 5000 AND (cCustomerPortalGroup IN (1)) AND (cSupplierCPId IN (-1000002,10006106,10006107)) AND cSupplierCGId = 100027 AND CISUNREGSUPPLIER = 0 AND CNCRHEADERID = 1604
Problem ist, dass die folgende Abfrage für RowNums > 100 falsche Werte liefert:
SELECT COUNT(*) AS cnt, CNCRHEADERID, LISTAGG(CASE WHEN ROWNUM <= 100 THEN CSERIALNO END, ';') WITHIN GROUP (ORDER BY CSNOPOSNR) AS CSERIALNO FROM TAIRNCR_SERIALNO GROUP BY CNCRHEADERID
SELECT CNCRHEADERID, MAX (cTotalLen) AS cTotalLenMax, CASE WHEN MAX(cTotalLen) > 4000 THEN listAgg(cSERIALNO,',') WITHIN GROUP (ORDER BY CSNOPOSNR)||'...' ELSE listAgg(cSERIALNO,',') WITHIN GROUP (ORDER BY CSNOPOSNR) END AS cSerialNoAgg FROM ( SELECT cNCRHEADERID, cSNOPOSNR, CASE WHEN cTotalLen > 3997 THEN SUBSTR(cSERIALNO, 1, LENGTH(cSerialNo) - (cTotalLen - 3997)) ELSE cSerialNo END AS cSerialNo, cTotalLen FROM ( SELECT CNCRHEADERID, CSNOPOSNR, cSERIALNO, SUM( LENGTH(cSERIALNO) + 1 ) OVER ( partition BY CNCRHEADERID ORDER BY CSNOPOSNR ASC ) cTotalLen FROM TAIRNCR_SERIALNO ) ) GROUP BY cNCRHEADERID
https://cust-projects.seeburger.de/redmine/issues/22382
https://cust-projects.seeburger.de/redmine/issues/21582
Das Ticket steht momentan auf “ON HOLD” (inoffiziell). Ich konnte es leider nicht nachvollziehen, der Burkhard hat aber keine Zeit, um mit mir das noch ein Mal durchzuspielen. Upd.: Er hat es alleine versucht und es hat auch nicht geklappt.
Notizen siehe 09.10.2017.