我很难在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用户。
所以我想:
我很感激一些意见。
答案 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