2

如何添加一列来显示两列中具有相同值的总行数,并且已经连接了多个表。在所有连接和 where 语句之后,我最终得到一个包含以下列的表:

产品 | 保单编号 | 行号 | 背书名称

表中有更多列,但这些是我需要参考的。从产品到保单编号存在一对多关系,从保单编号到行号存在一对多关系,从行号到背书或没有匹配关系可能存在一对多关系。

这是查询现在的样子:

Select pd.ProductName AS Product
,p.PolicyNumber AS Policy
,l.LineNumber AS Line
,e.EndorsementName AS Endorsement

FROM Lines l
INNER JOIN Policies p On p.PolicyID = l.PolicyID
LEFT OUTER JOIN Endorsements e on e.EndorsementID = l.EndorsementID
INNER JOIN Product pd on pd.ProductID = p.ProductID

结果表看起来像这样

Product     Policy     Line     Endorsement
CH           8001       1            A
CH           8001       2            A
CH           8001       3            A
CH           8001       3            B
CH           8002       1            D
CH           8002       2            D
CH           8002       3            A
PP           9001       1            NULL
PP           9001       2            NULL
PP           9002       1            A
PP           9002       2            A
PP           9002       2            B

我需要做的是计算每条政策线的背书数量。在上面的示例中,我会看到对于产品 CH,具有多个背书的唯一行项目是策略 8001 - 第 3 行。对于产品 PP,唯一具有多个背书的行项目是策略 9002 - 第 2 行。

我想要的第一件事是一个新列,它显示每一行的计数,显示该行的相同 Policy 和 Line 值的出现总数。该表将如下所示:

Product     Policy     Line     Endorsement     Line Endorsement Count
CH           8001       1            A                   1
CH           8001       2            A                   1
CH           8001       3            A                   2
CH           8001       3            B                   2
CH           8002       1            D                   1
CH           8002       2            D                   1
CH           8002       3            A                   1
PP           9001       1            A                   1
PP           9001       2            A                   1
PP           9002       1            A                   1
PP           9002       2            A                   2
PP           9002       2            B                   2

在我成功实现此计数后,我想要一个单独的查询,该查询仅返回包含没有任何具有多个背书的行的策略的行,因此在这种情况下,策略 8001 和 9002 不会出现。

我已经尝试过在不同的帖子中看到的各种不同的东西,并适应了我的需求,但还没有找到适用于这个特定示例的解决方案GROUP BYHAVING请记住,我也已经有很多WHERE陈述和一些订购依据。

编辑: 我正在使用 Microsoft SQL Server Management Studio 2010 来执行这些查询

谢谢!

4

2 回答 2

4

这取决于数据库。如果你有窗口函数,你可以很简单地做到这一点:

Select pd.ProductName as Product, p.PolicyNumber as Policy,
       l.LineNumber Line, e.EndorsementName as Endorsement,
       count(*) over (partition by policy, line) as Policy_Line_Count
FROM Lines l INNER JOIN
     Policies p
     On p.PolicyID = l.PolicyID LEFT OUTER JOIN
     Endorsements e
     on e.EndorsementID = l.EndorsementID INNER JOIN
     Product pd
     on pd.ProductID = p.ProductID

如果您没有 windows 功能,那么您可以使用 WITH 语句来简化查询:

with t as (
         Select pd.ProductName as Product, p.PolicyNumber as Policy,
            l.LineNumber Line, e.EndorsementName as Endorsement
     FROM Lines l INNER JOIN
          Policies p
          On p.PolicyID = l.PolicyID LEFT OUTER JOIN
          Endorsements e
          on e.EndorsementID = l.EndorsementID INNER JOIN
          Product pd
          on pd.ProductID = p.ProductID
   )
select t.*, tpl.cnt
from t join
     (select Policy, Line, count(*) as cnt
      from t
      group by Policy, Line
     ) tpl
     on t.Policy = tpl.Policy and
        t.Line= tpl.Line

最后,您可能正在使用既没有 WITH 语句也没有 windows 函数的 mysql。在这种情况下,您可以创建一个视图并使用上述查询。或者,您可以将原始查询放在临时表中并使用上述查询。或者,您使用原始查询并按照示例重复两次。

于 2012-08-16T21:43:40.463 回答
0

试一试:

Select pd.ProductName AS Product
,p.PolicyNumber AS Policy
,l.LineNumber AS Line
,e.EndorsementName AS Endorsement
,cnt

FROM Lines l
INNER JOIN Policies p On p.PolicyID = l.PolicyID
LEFT OUTER JOIN Endorsements e on e.EndorsementID = l.EndorsementID
INNER JOIN Product pd on pd.ProductID = p.ProductID
INNER JOIN (
    Select pd.ProductName AS subProduct
    ,p.PolicyNumber AS subPolicy
    ,l.LineNumber AS subLine
    ,COUNT(*) AS cnt

    FROM Lines l
    INNER JOIN Policies p On p.PolicyID = l.PolicyID
    INNER JOIN Product pd on pd.ProductID = p.ProductID
    GROUP BY pd.ProductName, p.PolicyNumber, l.LineNumber
    ) AS Sub ON pd.ProductName = subProduct, p.PolicyNumber = subPolicy, l.LineNumber = subLine
于 2012-08-16T21:49:16.873 回答