简体   繁体   中英

How to sum column values for each distinct value in another column

I have been working on a report for performance evaluation based on working time of personnel and the workstation. I manage to get all the information from the tables i need but i cant finalize the code to make it show as a single line. Here is what i use;

First i use these 2 selects so that i only have what i need as both of these tables have over 20-25 columns and a lot of rows;

SELECT CONFIRMATION, CONFIRMPOS, POTYPE, PRDORDER,
     OPERATION,PERSONELNUM,PERSONELNAME 
    FROM PERSONNEL 
    INTO TMPPERSONEL;

SELECT WORKCENTER, CONFIRMATION, CONFIRMPOS,SETUP,
     MACHINE, LABOUR, CONFIRMDATE 
    FROM CONF 
    INTO TMPCONF;

Next i use this select to combine the two tables to work on;

SELECT TMPPERSONNEL.POTYPE, TMPPERSONNEL.PRDORDER, TMPPERSONNEL.OPERATION, TMPCONF.WORKCENTER, TMPCONF.CONFIRMATION, TMPCONF.CONFIRMPOS, TMPPERSONNEL.PERSONELNUM, TMPPERSONNEL.PERSONELNAME, TMPCONF.SETUP, TMPCONF.MACHINE, TMPCONF.LABOUR, TMPCONF.CONFIRMDATE 
    FROM TMPPERSONNEL  LEFT JOIN TMPCONF ON  TMPCONF.CONFIRMATION = TMPPERSONNEL.CONFIRMATION 
        AND TMPCONF.CONFIRMPOS = TMPPERSONNEL.CONFIRMPOS 
    INTO TMPREPORT;

Now what i want to do is sum the time worked(SETUP,MACHINE,LABOUR) for each person or workstation between specific dates( DATE1,DATE2 ) and show it as a single line. For example from this table

PERSONELNUM  PERSONELNAME  WORKCENTER   SETUP  MACHINE  LABOUR  CONFIRMDATE 
1             Personnel1   WORKCENTER1     5     20       20    01.01.2014
1             Personnel2   WORKCENTER1     5     20       20    01.01.2014
1             Personnel2   WORKCENTER3     5     20       20    02.01.2014
1             Personnel1   WORKCENTER2     5     20       20    02.01.2014
1             Personnel3   WORKCENTER1     5     20       20    02.01.2014
1             Personnel3   WORKCENTER2     5     20       20    03.01.2014
1             Personnel1   WORKCENTER1     5     20       20    03.01.2014
1             Personnel2   WORKCENTER3     5     20       20    04.01.2014
1             Personnel1   WORKCENTER2     5     20       20    04.01.2014
1             Personnel3   WORKCENTER1     5     20       20    04.01.2014

to

PERSONELNUM  PERSONELNAME  SETUP  MACHINE  LABOUR 
1             Personnel1     20     80       80  
2             Personnel2     15     60       60    
3             Personnel3     15     60       60   

I am sorry if my explanation is confusing. As i am a beginner i can only describe the problem to the best of my small knowledge.

Edit: And what should i do if i want to see something like this:

PERSONELNUM  PERSONELNAME  WORKCENTER    SETUP  MACHINE  LABOUR 
  1          Personnel1    WORKCENTER1     10     40       40  
  1          Personnel1    WORKCENTER2     10     40       40 
  1          Personnel2    WORKCENTER1      5     20       20      
  1          Personnel2    WORKCENTER3     10     40       40 
  1          Personnel3    WORKCENTER1     10     40       40 
  1          Personnel3    WORKCENTER2      5     20       20  

It seems that your question is very similar to this one ?

I've listed a possible solution below

SELECT PERSONELNUM, PERSONELNAME, SUM(SETUP),SUM(MACHINE),SUM(LABOUR) AS PERSONELNAME_SUM FROM TABLE GROUP BY PERSONELNAME

Something like this should work.

SELECT
 PERSONALNUM,
 PERSONALNAME,
 SUM(SETUP) AS SETUP,
 SUM(MACHINE) AS MACHINE,
 SUM(LABOUR) AS LABOUR
FROM
 TMPREPORT
WHERE
 CONFIRMDATE BETWEEN 'DATE1' AND 'DATE2'
GROUP BY
 PERSONELNUM;

See http://dev.mysql.com/doc/refman/5.5/en/group-by-functions.html

did you tried grouping the personelnum column and summing the other columns? something like:

SELECT p.POTYPE, p.PRDORDER, p.OPERATION, c.WORKCENTER, c.CONFIRMATION, c.CONFIRMPOS, p.PERSONELNUM, p.PERSONELNAME, sum(c.SETUP), sum(c.MACHINE), sum(c.LABOUR), c.CONFIRMDATE 
FROM TMPPERSONNEL as p LEFT JOIN TMPCONF as c ON c.CONFIRMATION = p.CONFIRMATION 
    AND c.CONFIRMPOS = p.CONFIRMPOS 
group by
    p.PERSONELNUM
 INTO TMPREPORT;

in order to add more than one group by column you must add each of them seperating by a comma

SELECT p.POTYPE, p.PRDORDER, p.OPERATION, c.WORKCENTER, c.CONFIRMATION, c.CONFIRMPOS, p.PERSONELNUM, p.PERSONELNAME, sum(c.SETUP), sum(c.MACHINE), sum(c.LABOUR), c.CONFIRMDATE 
FROM TMPPERSONNEL as p LEFT JOIN TMPCONF as c ON c.CONFIRMATION = p.CONFIRMATION 
    AND c.CONFIRMPOS = p.CONFIRMPOS 
group by
    p.PERSONELNUM, c.WORKCENTER
 INTO TMPREPORT;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM