[mysql] Aggregate functies nesten

Pagina: 1
Acties:

  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
Ik wil in MySQL van een query die al een GROUP BY heeft de SUM hebben. Probleem is dat ik die GROUP BY moet laten staan, omdat deze belangrijk is voor de functie die wordt aangeroepen. De functie moet dus meerdere keren worden aangeroepen worden.

De query gaat als volgt (onderdeel van een procedure, die vult dus de verschillende variabelen in)

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
SELECT
    get_wage(
                mPid,
                SUM(`mScoreEntry`.`amount`) + IFNULL(SUM(DISTINCT(`mScoreVariable`.`amount`)), 0),
                work_date,
                `mSaleUnit`.`setMember`,
                personid
    )                                   AS  wage
FROM
    `mSaleUnit`
LEFT JOIN
    `mScoreVariable`
ON
    `mScoreVariable`.`fk_mSCid`         =   scoresheet                  AND
    `mScoreVariable`.`setMember`        =   `mSaleUnit`.`setMember`     AND
    `mScoreVariable`.`fk_pid`           =   personid
JOIN
    `mScoreEntry`
ON
    `mScoreEntry`.`fk_mSUid`            =   `mSaleUnit`.`mSUid`         AND
    `mScoreEntry`.`fk_mSCid`            =   scoresheet                  AND
    `mScoreEntry`.`fk_pid`              =   personid
GROUP BY
    mSaleUnit.setMember;


De functie get_wage wordt dus aangeroepen voor elke matchende unieke setMember, precies zoals de bedoeling is? Hoe krijg ik nu het totaal van de waarde die deze functie genereert terug? Ik heb zelf meerdere opties bedacht, deze zijn echter allemaal onhandig:

• Subquery: kan niet, omdat er meerdere resultaten zijn
• Cursors: lijkt me overkill voor zoiets simpels

Eigenlijk zoek ik dus iets wat dezelfde rijen genereert als WITH ROLLUP alleen dan zonder dat ik de originele rijen te zien krijg. Ik heb heel google afgestruind naar dingen als SUPER AGGREGATE maar ik vind niets waarmee ik enkel het totaal te zien krijg.

Ik ontken het bestaan van IE.


  • OnTracK
  • Registratie: Oktober 2002
  • Laatst online: 20:10
Geen idee of dit kan, iets staat me bij van group by in een subquery... maar daar weet ik het fijne niet van:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT
    SUM(
        SELECT
            get_wage(
                        mPid,
                        SUM(`mScoreEntry`.`amount`) + IFNULL(SUM(DISTINCT(`mScoreVariable`.`amount`)), 0),
                        work_date,
                        `mSaleUnit`.`setMember`,
                        personid
            ) AS  wage
        FROM
            `mSaleUnit`
        -- ...
        -- ...
        -- ...
        GROUP BY
            mSaleUnit.setMember
    ) AS sum_wage

Not everybody wins, and certainly not everybody wins all the time.
But once you get into your boat, push off and tie into your shoes.
Then you have indeed won far more than those who have never tried.


  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
OnTracK schreef op woensdag 11 juli 2007 @ 14:39:
Geen idee of dit kan, iets staat me bij van group by in een subquery... maar daar weet ik het fijne niet van:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT
    SUM(
        SELECT
            get_wage(
                        mPid,
                        SUM(`mScoreEntry`.`amount`) + IFNULL(SUM(DISTINCT(`mScoreVariable`.`amount`)), 0),
                        work_date,
                        `mSaleUnit`.`setMember`,
                        personid
            ) AS  wage
        FROM
            `mSaleUnit`
        -- ...
        -- ...
        -- ...
        GROUP BY
            mSaleUnit.setMember
    ) AS sum_wage
Die had ik al geprobeerd, maar een subquery MOET altijd maar 1 rij teruggeven. Dat doet deze query niet, dus werkt het niet.

Ik ontken het bestaan van IE.


  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
*bump*

Ik ontken het bestaan van IE.