【问题标题】:Recursively aggregate SQL columns递归聚合 SQL 列
【发布时间】:2014-04-09 21:54:58
【问题描述】:

我有两个表,我正在尝试构建一个查询,该查询将对所有数字列(利润/损失)执行 JOINSUM,然后再次对所有利润和所有利润执行 SUM损失。

也许我的表格设计得很糟糕 - 任何指导都值得赞赏。

现在,我有:

表格:公司

C_ID  |  NAME
-------------------
 1    |  Abc

表格:财务

ID  |  COMPANY_ID  |  INCOME1  |  INCOME2  | COST1  |  COST2
------------------------------------------------------------
1          1            200
2          1                        50
3          1                                   5
4          1                                   3
5          1                                             40

我正在寻找的输出类似于(其中 CASH 的起始值固定为 100)

C_ID  |  NAME  |  INCOME1  |  INCOME2  | COST1  |  COST2  |  CASH
------------------------------------------------------------------
 1       Abc       200          50         8        40       302

我尝试过的:

SELECT
    C.C_ID, C.NAME,
    SUM(F.INCOME1), SUM(F.INCOME2),
    SUM(F.COST1), SUM(F.COST2),
    (100 +
            (SELECT SUM(F.INCOME1), SUM(F.INCOME2) FROM FINS F)
          - (SELECT SUM(F.COST1), SUM(F.COST2) FROM FINS F)
    )
FROM COMP C
INNER JOIN FINS F
ON C.C_ID = F.COMPANY_ID
GROUP BY C.C_ID, C.NAME

【问题讨论】:

  • 在 SQL 中查找 PIVOT 运算符
  • 200+50 的收入和40+8 的成本是250 - 48 = 202 之后,你的现金不应该是202

标签: sql sql-server join aggregate-functions


【解决方案1】:

测试数据

DECLARE @Company TABLE(C_ID INT,NAME VARCHAR(10))
INSERT INTO @Company VALUES
(1,'Abc')

DECLARE @FINANCIAL TABLE
(ID INT,COMPANY_ID INT,INCOME1 INT,INCOME2 INT,COST1 INT,COST2 INT)
INSERT INTO @FINANCIAL VALUES
(1,1,200,NULL,NULL,NULL),
(2,1,NULL,50 ,NULL,NULL),
(3,1,NULL,NULL,  5,NULL),
(4,1,NULL,NULL,  3,NULL),
(5,1,NULL,NULL,NULL,40)

查询

SELECT *, INCOME1+INCOME2-COST1-COST2 AS CASH
FROM (
SELECT  C.C_ID
       ,C.NAME
       ,SUM(F.INCOME1) AS INCOME1
       ,SUM(F.INCOME2) AS INCOME2
       ,SUM(F.COST1)   AS COST1
       ,SUM(F.COST2)   AS COST2
FROM @Company C INNER JOIN @FINANCIAL F
ON C.C_ID = F.COMPANY_ID
GROUP BY C.C_ID
       ,C.NAME
      ) Q

结果集

╔══════╦══════╦═════════╦═════════╦═══════╦═══════╦══════╗
║ C_ID ║ NAME ║ INCOME1 ║ INCOME2 ║ COST1 ║ COST2 ║ CASH ║
╠══════╬══════╬═════════╬═════════╬═══════╬═══════╬══════╣
║    1 ║ Abc  ║     200 ║      50 ║     8 ║    40 ║  202 ║
╚══════╩══════╩═════════╩═════════╩═══════╩═══════╩══════╝

Working SQL FIDDLE

【讨论】:

  • 谢谢!这行得通。起始现金价值为 100,这就是为什么它最终应该是 302。
  • 没问题,很高兴它有帮助。好吧,当从所有列中添加值时,您可以添加 100。
  • 是的,明白了。非常感谢
【解决方案2】:

试试这个

SELECT C.C_ID, C.NAME, F.INCOME1, F.INCOME2, F.COST1, F.COST2, ((100 + F.INCOME1 + F.INCOME2) - (F.COST1 + F.COST2)) AS CASH
FROM COMPANY C
INNER JOIN
(
    SELECT COMPANY_ID, SUM(INCOME1) AS INCOME1, SUM(INCOME2) AS INCOME2
    , SUM(COST1) AS COST1, SUM(COST2) AS COST2
    FROM FINANCIAL
    GROUP BY COMPANY_ID
) F ON C.C_ID = F.COMPANY_ID

【讨论】:

    猜你喜欢
    • 2014-04-18
    • 2016-02-24
    • 2021-08-25
    • 2014-03-01
    • 2014-03-23
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多