在Access SQL

时间:2017-07-04 08:37:29

标签: sql ms-access

我刚开始访问数据库语言,遇到了以下问题。我创建了一个看起来像这样的表

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 BYWHERE直接从原始数据创建单独的销售和利润查询,如下所示:

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.

我还没有完成整个查询,但似乎我向前迈出了一大步。

1 个答案:

答案 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,然后以这种方式构建最终查询。