2014-02-27 25 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

相關問題