2017-05-05 90 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]