选择相同的列两次,条件不同

时间:2018-01-09 15:43:16

标签: mysql sql

我很难在SQL中达到目标。花了几个小时在这里和其他地方阅读类似的问题,但我的问题似乎很独特。

我的数据库有几列:

  

客户名称||项目||类型||日期||成本||修正
  Client1 Project1   电视2018-1 100没有
客户1项目1电视2018-1 -50是

所以表格保证一些解释。 (它还为每一行都有一个auto_inc ID。)Correction = no表示这是在预测财务时创建的原始值。 “是”意味着它是后来价格的修正。

我的目标是并排查看预测和实际情况。因此,对于每个月,它应该总结校正=没有值(这是非常简单的

SELECT date, SUM(cost) FROM table WHERE correction='no' GROUP BY date)

然后列出所有实际值(只是没有WHERE子句的SUM)。

需要根据客户端,项目,类型和日期匹配行。这看起来很简单,但我自然而然地遇到了单行错误。从逻辑上讲,我找不到如何做到这一点的解决方案,而且我更像是一个初学者 - 临时SQL用户。

所以我想:

  • 列有月,
  • 具有SUM(成本)的列WHERE correction ='no',
  • 和所有费用相加的专栏,当然这些都按月分开。

我很感激一些意见。

2 个答案:

答案 0 :(得分:3)

使用条件聚合。

聚合函数对一组值执行计算并返回单个值。

条件聚合是条件表达式的聚合,例如, correction = 'no'所有费用的总和。这是通过聚合函数(CASE此处)中的SUM构造完成的:

select 
  year(date), month(date),
  sum(case when correction = 'no' then cost end) as sum_no,
  sum(case when correction = 'yes' then cost end) as sum_yes,
  sum(cost) as sum_total
from mytable
group by year(date), month(date)
order by year(date), month(date;

答案 1 :(得分:0)

在这种情况下,我喜欢通过使用公用表表达式(CTE)来分解它。这允许我计算每个客户/项目/月的预计成本,并在一个CTE中将其设置为一边,然后分别计算另一个CTE中的实际成本,然后从每个结果中查询。

WITH projection AS (
    SELECT [client name], project, type, date, SUM(cost) cost FROM test WHERE correction='no' GROUP BY [client name], project, type, date
),
actual AS (
    SELECT [client name], project, type, date, SUM(cost) cost FROM test GROUP BY [client name], project, type, date
)
SELECT p."client name", p.project, p.type, p.date, p.cost AS "projected cost", a.cost AS "actual cost"
FROM projection p
JOIN actual a ON a."client name" = p."client name"
AND a.project = p.project 
AND a.type = p.type
AND a.date = p.date

注意:我使用以下内容构建我的测试表和值:

CREATE TABLE test ([client name] VARCHAR(100), project VARCHAR(100), type VARCHAR (100), date VARCHAR(100), cost INT, correction VARCHAR(100))

INSERT INTO test VALUES ('Client1', 'Project1', 'TV','2018-1', 100, 'no')
INSERT INTO test VALUES ('Client1', 'Project1', 'TV','2018-1', 200, 'no')
INSERT INTO test VALUES ('Client1', 'Project1', 'TV','2018-2', 300, 'no')
INSERT INTO test VALUES ('Client1', 'Project1', 'TV','2018-2', 400, 'no')

INSERT INTO test VALUES ('Client1', 'Project1', 'TV','2018-1', -50, 'yes')
INSERT INTO test VALUES ('Client1', 'Project1', 'TV','2018-2', -99, 'yes')
INSERT INTO test VALUES ('Client1', 'Project1', 'TV','2018-2', -75, 'yes')

INSERT INTO test VALUES ('Client1', 'Project2', 'TV','2018-1', 10, 'no')
INSERT INTO test VALUES ('Client1', 'Project2', 'TV','2018-1', 20, 'no')
INSERT INTO test VALUES ('Client1', 'Project2', 'TV','2018-2', 30, 'no')
INSERT INTO test VALUES ('Client1', 'Project2', 'TV','2018-2', 40, 'no')

INSERT INTO test VALUES ('Client1', 'Project2', 'TV','2018-1', -50, 'yes')
INSERT INTO test VALUES ('Client1', 'Project2', 'TV','2018-2', -99, 'yes')

我的结果:

"client name"   project   type   date     "projected cost"  "actual cost"
--------------- --------- ------ -------- ---------------- --------------
Client1         Project1  TV     2018-1                300            250
Client1         Project1  TV     2018-2                700            526
Client1         Project2  TV     2018-1                 30            -20
Client1         Project2  TV     2018-2                 70            -29