SQL(服务器)根据多行的精确条件筛选行

时间:2017-05-05 18:30:04

标签: sql sql-server

我觉得在我看来是一个复杂的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 个答案:

没有答案