Логически создавать шаблоны на основе таблицы пересечений - PullRequest
0 голосов
/ 27 октября 2011

Я не уверен, как описать вопрос, но я пытаюсь дать предложения о том, какие коды приписать тарифам.Я делаю это в Oracle.

Вот моя структура базы данных:

CODE (
    CODEID *PK NCHAR(10)
)

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

TARIFF (
    TARIFFNO NCHAR(15) *PK
)

Поэтому я пытаюсь логически создать шаблоны для того, какие коды должны быть назначены тарифам.Я представляю, что показываю что-то вроде: «6 тарифов также имеют эти 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;

Извините, если это сбивает с толку.

Я не знаю, возможно ли это вообще, но я ищу такой вывод:

Данные:TariffCode

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?

Ответы [ 2 ]

0 голосов
/ 28 октября 2011

Надеюсь, что приведенный ниже скрипт поможет вам.Он получит все возможные тарифы, не только на «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 голосов
/ 28 октября 2011

Попробуйте эту магию:

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, извините, но вы поймете идею

...