汇总具有相同ID /作业编号的列

时间:2014-02-28 18:05:34

标签: mysql sql

假设我有一个如下表所示,我如何按工作号和工作中心总结每周专栏。

+-----------+------------+---------------+--------+-----------------
| Job       |  Work_Date | Work_Center   |   Budget |     Weekly   |
+-----------+------------+---------------+--------+------+----------
|      5666 | 2014-02-23 | SURFACE       |     155  |      5       | 
|      5666 | 2014-02-23 | SURFACE       |     155  |      3       |      
|      5666 | 2014-02-23 | DESIGN        |     200  |      6       |                   
+-----------+------------+---------------+----------+--------------+

把它变成:

+-----------+------------+---------------+--------+-----------------
| Job       |  Work_Date | Work_Center   |   Budget |     Weekly   |
+-----------+------------+---------------+--------+------+----------
|      5666 | 2014-02-23 | SURFACE       |     155  |      8       |     
|      5666 | 2014-02-23 | DESIGN        |     200  |      6       |                   
+-----------+------------+---------------+----------+--------------+

修改

好的每周工作完美!但是,我遇到的一个问题是获得预算总和。通常,对于每个Work_Center,预算对于特定的Job AFAIK保持不变。但是,有一个缺失的部分。一个数字正在添加到预算中,因此,以Job 5666的预算为例,在我的Crystal Report中它给了我172而不是155.所以我做了一些进一步的挖掘,结果发现它没有像第一个那样添加重复的预算表,但如果它不是重复的话,它会添加一个值(根据我的理解)。

所以我发现了这一行。

+-----------+------------+---------------+--------+-----------------
| Job       |  Work_Date | Work_Center   |   Budget |     Weekly   |
+-----------+------------+---------------+--------+------+----------
|    5666-8 | NULL       | SURFACE       |     17   |      0       |                      
+-----------+------------+---------------+----------+--------------+

现在,如果我想将此值添加到预算中,当我尝试下面提供的SQL答案时,它就无法正常工作。我已经尝试修剪Job#所以它只是说5666所以它在Job #s中看到了一个匹配,它会将预算加在一起,但这也没有用。

我希望我的解释更清楚一点。

5 个答案:

答案 0 :(得分:2)

只需将结果分组并汇总Weekly列:

SELECT Job, Work_Date, Work_Center, Budget, SUM(Weekly)
FROM your_table
GROUP BY Work_Center, Job;

答案 1 :(得分:2)

SELECT Job,  Work_Date, Work_Center,  Budget, SUM( Weekly) FROM your_table GROUP BY Work_Center, Job

答案 2 :(得分:2)

就像Rich Hatch提到的那样,Work_Date不能包含在查询中,因为数据库不知道要返回哪个Work_Date(理论上,同一个Job和Work Center可能有不同的工作日期)。或者,您也可以1)GROUP BY工作日期列或2)选择MAX(工作日期),它与工作日期相同。所以,你可以写

SELECT Job, Max(Work_Date) as Work_Date, Work_Center, MAX(Budget) as Budget, SUM(Weekly)
FROM your_table
GROUP BY Work_Center, Job;

Related Question on SO

  • EDIT

为了响应您的编辑,我建议您进行以下修改后的查询。您可以选择仅添加不同的预算值。

SQL Server

SELECT LEFT(Job, CHARINDEX(Job, "-")-1) as Job, Max(Work_Date) as Work_Date, Work_Center, SUM(DISTINCT Budget) as Budget, SUM(Weekly) as Weekly
FROM your_table
GROUP BY Work_Center, LEFT(Job, CHARINDEX(Job, "-")-1);

<强>的Oracle

SELECT SUBSTR(Job, 1, INSTR(Job, "-")-1) as Job, Max(Work_Date) as Work_Date, Work_Center, SUM(DISTINCT Budget) as Budget, SUM(Weekly) as Weekly
FROM your_table
GROUP BY Work_Center, SUBSTR(Job, 1, INSTR(Job, "-")-1);

答案 3 :(得分:1)

其他答案缺少预算部分。

SELECT Job, Work_Date, Work_Center, avg(Budget), SUM(Weekly)
FROM your_table
GROUP BY Work_Center, Job;

注意:如果您正在使用SQL_STRICT模式,则此查询将失败,因为work_date不在您的组中。考虑到这一点,因为每个订单的Work_Date可能不同,所以最好将它从查询中删除,因为它将返回的日期不可靠。

答案 4 :(得分:1)

如果您只希望按Job和Work_Center分组,则Work_Date似乎无关紧要,而且您的评论似乎与预算无关。

你想要更接近这个:

SELECT Job, Work_Center, SUM(Weekly)
FROM your_table
GROUP BY Work_Center, Job