交差テーブルに基づいて論理的にテンプレートを作成する

私はどのように質問を記述するか分からないが、私は関税に属性を付けるコードを提案しようとしている。私はOracleでこれをやっています。

私のデータベース構造は次のとおりです。

CODE (
    CODEID *PK NCHAR(10)
)

CODETARIFF (
    TARIFFNO NCHAR(15) *PK *FK
    CODEID NCHAR(10) *PK *FK
)

TARIFF (
    TARIFFNO NCHAR(15) *PK
)

だから私は論理的にどのコードを関税に割り当てるべきかのためのテンプレートを作ろうとしている。私は、「6つの関税もまた、これらの2つのコードが関連付けられている」という行に沿って何かを示すことを想像しています。

私はこれを試しましたが、それぞれのコードに対して返されるカウントは実際にテンプレートを表示していません。私が指定した2つのコードが表示されたときの発生率しか表示されません。

SELECT COUNT(*), CodeID
FROM CodeTariff
  INNER JOIN (
    SELECT TariffNo, COUNT(*) 
    FROM CodeTariff
    WHERE CodeID IN ('ABC', 'DEF') 
    GROUP BY TariffNo
    HAVING COUNT(*) > 1) SQ 
  ON CodeTariff.TariffNo = SQ.TariffNo 
WHERE CodeID NOT IN ('ABC', 'DEF')
GROUP BY CodeTariff.CodeID
ORDER BY COUNT(*) DESC;

これは混乱している場合はごめんなさい。

私もこれが可能かどうかはわかりませんが、私はこのような出力を探しています:

データ:     関税コード

TariffNo        CodeID

1111            ABC
1111            DEF
2222            ABC
2222            DEF
2222            GHI
2222            JKL
3333            ABC
3333            DEF
3333            GHI
3333            JKL

アウトプット:(関税1111が与えられたとき)

CodesToAdd      Count

GHI, JKL        2

私は次のように表示することができます:

他の2つの関税には、それらに関連するコードGHIとJKLがあります。これらのコードを関税1111に追加しますか?

0
予想される結果を持つサンプルデータのほうが、このことが明確になるでしょうか?
追加された 著者 Tom H,
これは正解? :イベントのシーケンスは次のとおりです。(1)ユーザーが新しい料金表を作成します。 (2)ユーザは既存のコード( 'ABC' および 'DEF' )で料金表にタグを付ける。 (3)アプリは、関税にタグを付けることを望むかもしれない他のコードに対するいくつかの提案をユーザに与える。これらの提案のロジックは、 'ABC''DEF' の両方でタグ付けされた既存の関税を見つけ、既存の関税の中でそれが正しいとすれば、あなたの質問は私にとって正しいものになります。 。 。各コードについて、既存の関税がタグ付けされている数を示します。
追加された 著者 ruakh,
私は思う。 'GHI''JKL' を提案する理由は、の2つの料金表でそれぞれ > 'ABC' の2つの料金表で2つが一緒に使用されているため、 >と 'DEF'
追加された 著者 ruakh,
関税#3333もMNOとしてタグ付けされていたら、何を表示したいですか?
追加された 著者 ruakh,
はい、しかし、特定の数の関税が1つ以上のコードでタグ付けされていると言っているものはありません。本当のリンケージはありません。私は現在のクエリが意味をなさないと思います。
追加された 著者 tedski,
はい、それは正しいです
追加された 著者 tedski,

2 答え

これらの魔法を試してみてください:

SELECT     Code, COUNT(*) AS Count
FROM         (SELECT     dbo.TariffCode.Tariff, dbo.TariffCode.Code
                   FROM          dbo.TariffCode LEFT OUTER JOIN
                                              (SELECT     TariffCode_2.Tariff, TariffCode_2.Code
                                                FROM          dbo.TariffCode AS TariffCode_2 INNER JOIN
                                                                           (SELECT     Tariff, Code
                                                                             FROM          dbo.TariffCode AS TariffCode_1
                                                                             WHERE      (Tariff = '1111')) AS TariffsWithSharedCodes ON TariffCode_2.Code = TariffsWithSharedCodes.Code AND 
                                                                       TariffCode_2.Tariff <> '1111') AS MutualCodes ON dbo.TariffCode.Tariff = MutualCodes.Tariff AND 
                                          dbo.TariffCode.Code = MutualCodes.Code
                   WHERE      (MutualCodes.Code IS NULL) AND (dbo.TariffCode.Tariff <> '1111')) AS MissingCodes
GROUP BY Code
ORDER BY Count DESC, Code

これはT-SQLです。申し訳ありませんが、あなたはアイデアを得るでしょう

0
追加された

以下のスクリプトがあなたを助けてくれることを願っています。 '1111 'だけでなく、すべての関税を得ることができます:

with temp as (
  select tariffno, tariffno2, codeid 
  from (
    select distinct c1.tariffno, c2.tariffno as tariffno2, c2.codeid
    from tariffcode c1
    join tariffcode c2 on c1.tariffno != c2.tariffno and c1.codeid != c2.codeid 
  ) c1 
  where 
    not exists (select 1 from tariffcode where tariffno = c1.tariffno and codeid = c1.codeid)
)
select tariffno, codeid, count(*) as cnt from temp group by tariffno, codeid;
0
追加された