2017-05-05 87 views
0

我覺得在我看來是一個複雜的SQL要求,我需要查詢數據表以返回具有不同版本的記錄集的完全匹配。SQL(服務器)按多行確切條件篩選行

換言之,我有多個版本,每個版本可以有一個或多個產品|報價組合。如果我通過產品|報價組合,我想返回所有版本只有那些確切的組合(不多也不少)。

最重要的是,我有一些產品|引號重複多次(作爲一個包),所以我需要將它們作爲一個獨立的實體進行分組,並將它們視爲每個版本的一個。

它變得很複雜,我不確定SQL是否甚至是最好的工具來處理這個問題,或者如果我缺少高級技能來完成任務。

這就是說,這裏是一個樣本數據集(如下所示組織的可視化,請參閱下面的實際數據集可以複製):

enter image description here

預期v實際業績的位置:

enter image description here

SQL在下面(我也有挖掘到EXCEPT有點認爲可能有幫助,但我失去了我的能力看看這個了):

備註 - HAVING Count(version_num)需要根據產品數量變更爲1,2,3等。引用組合輸入。

SELECT Account_No, version_num, -- LineOfBus, ProductNo, QuoteNo, 
      SUM(CASE 
       WHEN ISNUMERIC(TotalPremium) = 1 THEN CONVERT(decimal(16,2),TotalPremium) 
       END) As TotalPremium 
     FROM 
     (SELECT t.Account_No, t.version_num, 
      CASE 
       WHEN ISNull(t.PackageIndicator,'0') = '1' THEN 'Package' Else t.Lob 
      END AS LineOfBus, 
      t.ProductNo, t.QuoteNo, 
      ISNull(CASE 
         WHEN ISNUMERIC(t.TotalPremium) = 1 THEN CONVERT(decimal(16,2),t.TotalPremium) 
        END, 0) TotalPremium 
      FROM zzzScottTest as T 
      WHERE t.version_num IN 
       (SELECT sqVersionNumber.version_num 
        FROM 
        /* this captures unique package product records (or just stand alone records as well) */ 
        (SELECT DISTINCT sqUnique.version_num, Count(sqUnique.version_num) VersionCount 
         FROM 
         /* grab list of all uniquer version, product, quote combinations (use distinct to combine package */ 
          (SELECT DISTINCT version_num, productNo, quoteNo 
           FROM zzzScottTest 
           WHERE Account_No = 'b' /* pass as parameter */ 
            AND ProductNo IN ('8888') /* pass as parameter */ 
            AND QuoteNo IN ('999') /* pass as parameter */ 
          ) AS sqUnique 
         GROUP BY version_num 
         HAVING Count(version_num) = 1 /* pass as variable based on number of products, quotes */ 
        ) as sqVersionNumber 
       ) 
      AND t.Account_no = 'b' /* pass as parameter */ 
      AND t.ProductNo IN ('8888') /* pass as parameter */ 
      AND t.QuoteNo IN ('999') /* pass as parameter */) as sqLOB 
     GROUP BY Account_No, version_num --, LineOfBus, ProductNo, QuoteNo 

最後 - 樣本數據集複製:

Account_No Version_Num LOB ProductNo QuoteNo TotalPremium PackageIndicator RowNo 
b 1 GL 1234 987 100 1 1 
b 1 Auto 1234 987 200 1 2 
b 1 WC 7891 321 300 0 3 
b 2 GL 2222 222 100 0 1 
b 2 Auto 4567 654 200 0 2 
b 3 GL 2222 222 100 0 1 
b 4 GL 2222 222 110 0 1 
b 5 GL 2222 222 115 0 1 
b 5 Auto 4567 654 250 0 2 
b 6 GL 1234 987 100 1 1 
b 6 Auto 1234 987 200 1 2 
b 6 WC 7891 321 350 0 3 
b 7 WC 7891 321 350 0 1 
b 7 Prop 8888 999 400 0 2 
b 8 GL 1234 987 111 1 1 
b 8 Auto 1234 987 222 1 2 
b 9 GL 2222 222 100 0 1 
b 9 Auto 4567 654 200 0 2 
b 9 WC 9999 888 150 0 3 
b 10 GL 2222 222 100 0 1 
+0

您的要求並不複雜;我認爲你是在過度查詢。我正在嘗試讀取你的SQL,但是過分嵌套的子選擇很難。此外,它不會幫助您不知道您是否僅有測試用途的所有參數,或者您是否真正在最終形式中使用它們。 – Anand

+0

@Anand - 我同意我是過度的。我感覺就像在我的SQL頭上。請建議更好的子查詢格式。或者可以直接編輯問題。參數將根據數據集以最終形式使用。 'ProductNo','QuoteNo'和'HAVING Count(version_num)'可以根據樣本數據進行調整。 –

回答

0

一位同事,在SQL更精通然後我解決了這個問題。

SELECT U.[account_no],U.[version_num], 
     SUM(CASE 
       WHEN ISNUMERIC(U.TotalPremium) = 1 THEN CONVERT(decimal(16,2),TotalPremium) 
      END) As TotalPremium 
    FROM [dbo].[zzzScottTest] as U 

    INNER JOIN 

    (Select distinct U1.Account_No, U1.version_num From dbo.[zzzScottTest] U1 
     Inner Join 
      (SELECT DISTINCT ST2.Account_No, ST2.version_num, 
       substring((SELECT ','+ ST1.ProductNo AS [text()] 
         FROM (SELECT DISTINCT Account_No, version_num, ProductNo, QuoteNo 
           FROM [zzzScottTest]) ST1 
         WHERE ST1.version_num = ST2.version_num 
          AND ST1.Account_No = ST2.Account_No 
         ORDER BY ST1.Account_No,ST1.version_num 
         FOR XML PATH ('')) 
       , 2, 1000) [AllProduct] 
       , 
       substring((SELECT ','+ ST3.QuoteNo AS [text()] 
         FROM (SELECT DISTINCT Account_No, version_num, ProductNo, QuoteNo 
         FROM [zzzScottTest]) ST3 
         WHERE ST3.version_num = ST2.version_num 
          AND ST3.Account_No = ST2.Account_No 
         ORDER BY ST3.version_num 
         FOR XML PATH ('')) 
       , 2, 1000) [AllQuote] 
     FROM dbo.[zzzScottTest] ST2 
     GROUP BY ST2.Account_No, ST2.version_num, ST2.ProductNo, ST2.QuoteNo) Temp 
     ON 
      Temp.Account_No = U1.Account_No and 
      Temp.version_num = U1.version_num and 
      Temp.[AllProduct] = '8888' and 
      Temp.[AllQuote] = '999' 
      ) AS Final 
     ON 
      Final.Account_No = U.Account_No and 
      Final.version_num = U.version_num 
     GROUP BY U.account_no, U.[version_num]