2014-02-27 22 views
4

Iam新的在这里,并希望我可以在这里找到一些帮助。如何总结重复字段的不同值

我有以下问题: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 

正如你可以在第一选择看,我数着不同的数据(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的成本?

在此先感谢。

回答

1

如果我有它的权利,你需要加入不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

+0

感谢您的帮助。这工作:)现在我将尝试消除可怕的OU结构。目前在每个OU的当前SQL过程中,sql被复制...(此时为8 OU)我相信它必须可以使其无需复制粘贴:) – WhoisIt

0

这里的另一种方法: 我已经使用Distinct关键字排除重复项,而不是在派生表中选择USEDt1

SELECT TD.Acct , 
      SUM(t1.Cost) AS Cost ,   
      TD.OU01 , 
      TD.OU02 
    FROM TestData TD 
      INNER JOIN 
       (select distinct Acct, Secondkey, Name, Cost, ou01, ou02 
       from TestDepends) t1 ON t1.Acct = TD.Acct 
              AND (TD.OU01 = '' 
               OR ISNULL(TD.OU01, '') = ISNULL(t1.OU01, '') 
              ) 
              AND (TD.OU02 = '' 
               OR ISNULL(TD.OU02, '') = ISNULL(t1.OU02, '') 
              ) 
    WHERE TD.depths = 2 
    GROUP BY TD.Acct , 
      TD.OU01 , 
      TD.OU02 

演示:http://sqlfiddle.com/#!3/76470/23

+0

感谢您的帮助,不幸的是我需要使用柱。在我的最终结果中,我需要使用大小写什么时候决定是否计算SecondKey,或者如果我对不同的值进行求和。 – WhoisIt

相关问题