我刚开始访问数据库语言,遇到了以下问题。我创建了一个看起来像这样的表
TBL1
Year Account AccValue
2014 Sales 1000
2014 Cost -400
2014 Tax -200
2015 Sales 1200
2015 Cost -900
我想要做的是创建一个计算财务指标的查询,例如毛利润(销售成本),净利润(销售成本税),毛利率([销售成本] /销售额)年度,这意味着最终我希望能够访问这样的查询:
Year FAccount FAccValue
2014 Gross profit 600
2014 Net profit 400
2014 Gross margin 60%
2015 Gross profit 300
2015 Net profit 300
2015 Gross margin 25%
我提到了一些我手边的基本SQL资料,但他们只是介绍了如何基于不同列的数据进行过滤和计算,例如如何从给定的价格和数量列计算销售额,所以基本上计算输出输入的行数相同。
在这种情况下,我需要根据特定列(“年”和“帐户”)选择要计算的数据行,并使用特定列存储结果。
我确实可能会将结果存储在单独的查询中,例如“tbl_grossprofit”,“tbl_grossmargin”等,并创建另一个查询来总结它们,但我不确定在这种情况下哪一个是“常规”。
很抱歉,如果这是一个基本问题,非常感谢帮助!
- 编辑 -
我一直在尝试如何在Access中使用子查询,但在这种情况下我无法找到使用它们的方法。因此,我所做的解决方法是使用GROUP BY
和WHERE
直接从原始数据创建单独的销售和利润查询,如下所示:
qry_Sales
Year Sales
2014 1000
2015 1200
qry_Profit
Year Gross Profit
2014 400
2015 300
然后我通过
创建了另一个关于毛利率的查询SELECT qry_Profit.[Gross profit]/qry_Sales.[Sales] AS [Gross margin], qry_Profit.[Year]
FROM qry_Profit,qry_Sales
GROUP BY [Year]
这最终取决于我期望的结果,但如果我遵循这个想法,那将意味着创建数十个查询。我相信有更好的方法。你能给我一些建议吗?
此外,老实说,我希望将行帐户名(例如“毛利”,“净利润”)存储在行中(如原始帖子中所示),这样我就可以在Excel中更容易地显示它们。谢谢。
编辑2 我在这里和this question结合了一些很棒的想法,并最终得到了像
这样的解决方法SELECT [Year],
(SELECT Sum(AccValue) FROM tbl AS Cal WHERE Cal.[Year]=tbl.[Year] AND Account=Sales) AS Sales,
(SELECT Sum(AccValue) FROM tbl AS Cal WHERE Cal.[Year]=tbl.[Year] AND Account=Cost) AS Cost,
Sales-Cost AS [Gross profit]
[Gross profit]/Sales AS [Gross Margin]
FROM tbl1
GROUP BY [Year]
--The Sum function is unnecessary here, but in the real case Sales data is divided into many rows.
我还没有完成整个查询,但似乎我向前迈出了一大步。
答案 0 :(得分:0)
这有望让你入门。
首先创建示例表并用数据填充它:
(01[5-9]\d{8})$
然后,定义CTE以获取每年的成本,税和销售额。我们加入三年的CTE,然后可以对它们进行计算。我使用CREATE Table tbl1 (Year int, account nvarchar(25), AccValue int)
INSERT INTO tbl1
VALUES (2014, 'Sales', 1000), (2014, 'Cost', -400), (2014, 'Tax', -200), (2015, 'Sales', 1200), (2015, 'Cost', -900)
;
来考虑税收可能是未知的(如2015年)。
LEFT JOIN
输出:
WITH Sales AS (
SELECT [Year], AccValue FROM tbl1 WHERE Account = 'Sales'
), Cost AS (
SELECT [Year], AccValue FROM tbl1 WHERE Account = 'Cost'
), Tax AS (
SELECT [Year], AccValue FROM tbl1 WHERE Account = 'Tax'
)
SELECT
a.[Year]
, SUM(a.AccValue + b.accValue) AS GrossProfit
, SUM(a.AccValue + b.accValue - ISNULL(c.AccValue, 0)) AS GrossProfit
FROM
Sales a
LEFT JOIN Cost b ON a.[Year] = b.[Year]
LEFT JOIN Tax c ON a.[Year] = c.[Year]
GROUP BY a.[Year]
对于Access,您应该能够将各个子查询存储为Access中的查询,而不是使用CTE,然后以这种方式构建最终查询。