2

複数のテーブルが既に結合されている状態で、2 つの列に同じ値を持つ行の総数を表示する列を追加するにはどうすればよいですか。すべての結合と where ステートメントの後、次の列を持つテーブルになります。

製品 | ポリシー番号 | 行番号 | 裏書名

表にはさらに多くの列がありますが、参照する必要があるのはこれらの列です。Product から Policy Number への 1 対多の関係、Policy Number から Line Number への 1 対多の関係、Line Number から Endorsement への 1 対多の関係、または一致しない関係があります。

現在のクエリは次のようになります。

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 BYた。HAVING私はすでにかなりの数のWHEREステートメントといくつかの Order By も持っていることを覚えておいてください。

編集: 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を使用している可能性があります。この場合、ビューを作成して上記のクエリを使用できます。または、元のクエリを取得して一時テーブルに配置し、上記のクエリを使用することもできます。または、元のクエリを取得して、例に従って2回繰り返します。

于 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 に答える