【问题标题】:How to calculate arithmetic expression of column members database table?如何计算列成员数据库表的算术表达式?
【发布时间】:2014-01-12 12:24:44
【问题描述】:

我有这个查询的结果

SELECT
    myTable.Branch AS Branch,
    myTable.Quarter AS Quarter,
    SUM(myTable.Sales) AS Sales
FROM
    myTable
GROUP BY
    myTable.Branch,
    myTable.Quarter

Branch  Quarter Sales
B1      Q1      17
B1      Q2      7
B1      Q3      1
B1      Q4      8
B1      Q5      12
B2      Q1      8
B2      Q2      5
B2      Q3      2
B2      Q4      14
B2      Q5      17

现在我想得到计算成员让我们说Q1-Q3 那么结果应该是这样的

Branch  Quarter     Sales
B1      Q1          17
B1      Q2          7
B1      Q3          1
B1      Q4          8
B1      Q5          12
B1      Q1-Q3       16
B2      Q1          8
B2      Q2          5
B2      Q3          2
B2      Q4          14
B2      Q5          17
B2      Q1-Q3       6

表达式可以是任何有效的算术表达式,例如(Q1+Q2-Q3)*2

【问题讨论】:

    标签: sql database select sql-server-2012 aggregate


    【解决方案1】:

    您可以创建一个表,将 Q1、Q2、Q3、Q4 作为每个分支的列:

    http://sqlfiddle.com/#!6/eca51/14/0

    SELECT
        Branch,
        SUM(CASE WHEN quarter='Q1' THEN sales END) AS Q1,
        SUM(CASE WHEN quarter='Q2' THEN sales END) AS Q2,
        SUM(CASE WHEN quarter='Q3' THEN sales END) AS Q3,
        SUM(CASE WHEN quarter='Q4' THEN sales END) AS Q4
    FROM
        sales
    GROUP BY Branch
    

    这给出了:

    | BRANCH | Q1 | Q2 | Q3 | Q4 |
    |--------|----|----|----|----|
    |     B1 | 17 |  7 |  1 |  8 |
    |     B2 |  8 |  5 |  2 | 13 |
    

    您可以将其用作子查询并执行您喜欢的任何算术。

    SELECT Branch, Q1+2*Q2 AS Weighted,SQRT(Q1*Q2) GeometricMean
      FROM (
      SELECT
          Branch,
          SUM(CASE WHEN quarter='Q1' THEN sales END) AS Q1,
          SUM(CASE WHEN quarter='Q2' THEN sales END) AS Q2,
          SUM(CASE WHEN quarter='Q3' THEN sales END) AS Q3,
          SUM(CASE WHEN quarter='Q4' THEN sales END) AS Q4
      FROM
          sales
     GROUP BY Branch) AS BQ
    

    这给出了:

    | BRANCH | WEIGHTED |   GEOMETRICMEAN |
    |--------|----------|-----------------|
    |     B1 |       31 | 10.908712114636 |
    |     B2 |       18 |  6.324555320337 |
    

    这取决于已知和固定的季度数 - 我猜有 4 个,但您似乎有 5 个。

    【讨论】:

      【解决方案2】:

      试试这个:

      SELECT m.Branch, m.Quarter, m.Sales
      FROM (SELECT m.Branch, m.Quarter, SUM(m.Sales) AS Sales
            FROM myTable m
            GROUP BY m.Branch, m.Quarter
            UNION 
            SELECT m.Branch, 'Q1+Q3' AS `Quarter`, SUM(m.Sales) AS Sales
            FROM myTable m 
            WHERE m.Quarter IN ('Q1', 'Q3')
            GROUP BY m.Branch
           ) AS m 
      ORDER BY m.Branch, m.Quarter;
      

      【讨论】:

      • 如果操作数之间只有总和,这将起作用。如果表达式是 Q1*2 或 Q1-Q2 或 Q1/Q2 怎么办?
      【解决方案3】:

      试试这个, 首先通过 CTE 获取第一个查询的输出

      ;含 cte(分公司、季度、销售) 作为 (选择 myTable.Branch AS 分支, myTable.Quarter 作为季度, SUM(myTable.Sales) 作为销售 从 我的表 通过...分组 myTable.Branch, myTable.Quarter)

      选择分公司、季度、销售 来自 CTE

      联合

      选择分公司,'Q1-Q3' AS 季度,'Q1 Sales -Q3 Sales' AS 销售额 来自 CTE

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-16
        • 2011-01-25
        • 1970-01-01
        • 1970-01-01
        • 2017-10-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多