假设我有一个如下表所示,我如何按工作号和工作中心总结每周专栏。
+-----------+------------+---------------+--------+-----------------
| 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中看到了一个匹配,它会将预算加在一起,但这也没有用。
我希望我的解释更清楚一点。
答案 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;
为了响应您的编辑,我建议您进行以下修改后的查询。您可以选择仅添加不同的预算值。
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