sql - 如何对重复字段的不同值求和

标签 sql sum distinct

我是新来的,希望我能在这里找到一些帮助。

我有以下问题:Fiddle SQL Demo

CREATE TABLE TestData
    (
      [Acct] INT ,
      [Desc] VARCHAR(100) ,
      [OU01] VARCHAR(100) ,
      [OU02] VARCHAR(100) ,
      DEPTHS INT
    );

CREATE TABLE TestDepends
    (
      [Acct] INT ,
      [SecondKey] NUMERIC(9, 0) ,
      [Name] VARCHAR(100) ,
      [COST] NUMERIC(9, 0) ,
      [used] TINYINT ,
      [OU01] VARCHAR(100) ,
      [OU02] VARCHAR(100)
    );



INSERT  INTO TestData
VALUES  ( 1, 'Feld 1', 'OU01', '', 1 );
INSERT  INTO TestData
VALUES  ( 1, 'Feld 1', 'OU01', 'OU02', 2 );
INSERT  INTO TestData
VALUES  ( 1, 'Feld 1', 'OU01', 'OU03', 2 );
INSERT  INTO TestData
VALUES  ( 1, 'Feld 1', 'OU02', '', 1 );


INSERT  INTO TestDepends
VALUES  ( 1, 21, 'Name 1', 120, 0, 'OU01', 'OU02' );
INSERT  INTO TestDepends
VALUES  ( 1, 22, 'Name 2', 50, 0, 'OU01', '' );
INSERT  INTO TestDepends
VALUES  ( 1, 21, 'Name 1', 120, 1, 'OU01', 'OU02' );
INSERT  INTO TestDepends
VALUES  ( 1, 23, 'Name 3', 111, 0, 'OU01', 'OU03' );
INSERT  INTO TestDepends
VALUES  ( 1, 24, 'Name 4', 99, 0, 'OU02', '' );
INSERT  INTO TestDepends
VALUES  ( 1, 25, 'Name 5', 120, 0, 'OU01', 'OU02' );

SELECT  TD.Acct ,
        COUNT(DISTINCT TDS.SecondKey) AS Found ,
        COUNT(DISTINCT CASE WHEN TDS.Used = 1 THEN TDS.SecondKey
                       END) AS Used ,
        TD.OU01 ,
        TD.OU02
FROM    TestData TD
        INNER JOIN TestDepends TDS ON TDS.Acct = TD.Acct
                                      AND ( TD.OU01 = ''
                                            OR ISNULL(TD.OU01, '') = ISNULL(TDS.OU01, '')
                                          )
                                      AND ( TD.OU02 = ''
                                            OR ISNULL(TD.OU02, '') = ISNULL(TDS.OU02, '')
                                          )
WHERE   TD.depths = 2
GROUP BY TD.Acct ,
        TD.OU01 ,
        TD.OU02

正如您在第一个 Select 中看到的那样,我计算了不同的数据(SecondKey),这非常有效。

现在我想总结所有不同数据的所有成本
  SELECT  TD.Acct ,
            SUM(TDS.Cost) AS Cost ,
            SUM(TDS.Cost) AS Cost ,
            TD.OU01 ,
            TD.OU02
    FROM    TestData TD
            INNER JOIN TestDepends TDS ON TDS.Acct = TD.Acct
                                          AND ( TD.OU01 = ''
                                                OR ISNULL(TD.OU01, '') = ISNULL(TDS.OU01, '')
                                              )
                                          AND ( TD.OU02 = ''
                                                OR ISNULL(TD.OU02, '') = ISNULL(TDS.OU02, '')
                                              )
    WHERE   TD.depths = 2
    GROUP BY TD.Acct ,
            TD.OU01 ,
            TD.OU02

正如您所看到的,它也总结了“重复”(不是整行是重复,而是 SecondKeys)行。是否可以总结仅不同 SecondKeys 的所有成本?

提前致谢。

最佳答案

如果我猜对了,你需要加入而不是 TestDepends但查询 GROUP BY避免重复:

....
FROM    TestData TD
        INNER JOIN 
           ( 
            SELECT Acct,
                   SecondKey,   
                   Name,
                   cost,
                   MAX(used) as used,
                   OU01,
                   OU02
             FROM
             TestDepends 
             GROUP BY Acct,SecondKey,Name,cost, OU01, OU02
           )  
         TDS ON ....

SQL Fiddle demo

关于sql - 如何对重复字段的不同值求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22062771/

相关文章:

sql - 减去两个 SUM GROUP BY 字段

mysql - 如果我的列值在 MySQL 中以逗号显示,如何选择行?

mysql select 区别(减)

mysql - 按支出金额选择 SUM 用户

javascript - 查找对象数组中的特定元素并将其添加

mysql - 查询 SQL 的 4 个字段(共 5 个)不同,返回表中的所有字段

sql - 查找产品之间共同帐户的不同计数

sql - 使用全局临时表可以吗?

sql - 插入符号 (^) 在 SQL 查询中起什么作用?

sql - 获取 SSMS 中彼此相反的两列的区别