Maak op logische wijze sjablonen op basis van de kruistabel

Ik weet niet zeker hoe ik de vraag moet beschrijven, maar ik probeer suggesties te geven over welke codes aan de tarieven moeten worden toegewezen. Ik doe dit in Oracle.

Dit is mijn databasestructuur:

CODE (
    CODEID *PK NCHAR(10)
)

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

TARIFF (
    TARIFFNO NCHAR(15) *PK
)

Dus ik probeer logisch sjablonen te maken voor welke codes moeten worden toegewezen aan tarieven. Ik stel me voor dat ik iets laat zien in de trant van: "6 tarieven hebben ook deze 2 codes die aan hen zijn gekoppeld"

Ik heb dit geprobeerd, maar de tellingen die voor elk van de codes worden geretourneerd, laten niet echt een sjabloon zien, ze tonen alleen echt gevallen van wanneer die code wordt weergegeven met de twee die ik heb opgegeven.

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;

Sorry als dit verwarrend is.

Ik weet niet of dit zelfs mogelijk is, maar ik zoek naar uitvoer zoals deze:

Gegevens:     Tariefcode

TariffNo        CodeID

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

Output: (wanneer tarief 1111 wordt gegeven)

CodesToAdd      Count

GHI, JKL        2

Zodat ik kan weergeven:

Bij 2 andere tarieven zijn de codes GHI en JKL gekoppeld. Wilt u deze codes toevoegen aan tarief 1111?

0
Misschien kunnen enkele voorbeeldgegevens met verwachte resultaten dit duidelijker maken?
toegevoegd de auteur Tom H, de bron
Is dit juist? : De volgorde van gebeurtenissen is: (1) de gebruiker maakt een nieuw tarief aan; (2) de gebruiker tagt het tarief met enkele bestaande codes ( 'ABC' en 'DEF' ); (3) de app geeft de gebruiker enkele suggesties voor andere codes waarmee hij het tarief wenst te taggen. De logica voor deze suggesties is dat de app reeds bestaande tarieven vindt die zijn getagd met zowel 'ABC' en 'DEF' , en ziet welke andere codes het vaakst worden gevonden van de reeds bestaande tarieven. Als dat klopt, dan ziet uw vraag er goed uit. . . voor elke code toont het hoeveel bestaande tarieven ermee zijn gelabeld.
toegevoegd de auteur ruakh, de bron
Ik denk dat ik het zie. De reden dat u 'GHI' en 'JKL' wilt voorstellen, is niet dat ze elk worden gebruikt op twee tarieven met 'ABC' en 'DEF' , maar omdat ze samen worden gebruikt samen op twee tarieven met 'ABC' en 'DEF' ?
toegevoegd de auteur ruakh, de bron
Dus wat zou u willen weergeven als tarief # 3333 ook als MNO was getagd?
toegevoegd de auteur ruakh, de bron
Ja, maar er is niets dat zegt dat een bepaald aantal tarieven zijn getagd met een of meer codes, er is geen echt verband. Ik denk dat de huidige vraag echter wel logisch is.
toegevoegd de auteur tedski, de bron
Ja dat is correct
toegevoegd de auteur tedski, de bron

2 antwoord

Probeer deze magica uit:

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

Dit is T-SQL, sorry, maar je krijgt het idee

0
toegevoegd

Ik hoop dat het onderstaande script je kan helpen. Het krijgt alle mogelijke tarieven, niet alleen voor '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
toegevoegd