Mantiqiy ravishda kesish jadvali asosida yaratilgan andozalar

Savolni qanday tasvirlash mumkinligiga ishonchim komil emas, lekin tariflarni belgilashda qanday kodlar haqida takliflar berishga harakat qilaman. Men buni Oracle'da qilyapman.

Mana mening ma'lumotlar bazam tuzum:

CODE (
    CODEID *PK NCHAR(10)
)

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

TARIFF (
    TARIFFNO NCHAR(15) *PK
)

Shuning uchun tariflarni qaysi kodlarga qo'yish kerakligini shubhali qilishni istayman. "6 tarifda ular bilan bog'liq 2 ta kod mavjud"

Men buni sinab ko'rdim, lekin kodlarning har biri uchun qaytarilgan hisoblar chindan ham shablonni ko'rsatmaydi, faqat ular ko'rsatgan ikkala kod bilan qachon paydo bo'lishini ko'rsatadilar.

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;

Afsuski, bu shoshqaloqlik.

Buning iloji yo'qligini bilmayman, lekin shunga o'xshash chiqishni izlayapman:

Ma'lumotlar:     Tarif kodi

TariffNo        CodeID

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

Chiqish ma'lumotlari: (agar tarif 1111 bo'lsa)

CodesToAdd      Count

GHI, JKL        2

Ko'rsata oladigan qilib:

Boshqa tariflarda GHI va JKL kodlari mavjud. Ushbu kodlarni 1111 tarifiga qo'shmoqchimisiz?

0
Ehtimol, kutilgan natija bilan ba'zi bir namunaviy ma'lumotlar buni aniqroq qilishi mumkinmi?
qo'shib qo'ydi muallif Tom H, manba
Bu haqmi? : Voqealar ketma-ketligi: (1) foydalanuvchi yangi tarif yaratadi; (2) foydalanuvchi tarifni ba'zi mavjud bo'lgan kodlar bilan belgilaydi ( 'ABC' va 'DEF' ); (3) ilova foydalanuvchi tomonidan boshqa kodlar uchun ba'zi takliflarni taqdim etadi, u (ular) u tarifni belgilashni xohlashi mumkin. Ushbu takliflarning mantiqiysi, ilova ham 'ABC' va 'DEF' kodlari bilan yozilgan mavjud tariflarni topadi va boshqa kodlarning eng ko'p uchraydigan mavjud bo'lgan tariflar orasida. Agar bu to'g'ri bo'lsa, so'rovingiz menga to'g'ri keladi. . . har bir kod uchun u mavjud bo'lgan tariflar qancha cheklanganligini ko'rsatadi.
qo'shib qo'ydi muallif ruakh, manba
Menimcha, men ko'raman. 'GHI' va 'JKL' ni taklif qilishni istagan sabab <<>> "ABC" va 'DEF' deb nomlangan ikkita tarif bo'yicha ikkita birgalikda > va 'DEF' ?
qo'shib qo'ydi muallif ruakh, manba
3333-sonli tarif MNO deb etiketlasa, nima qilish kerak?
qo'shib qo'ydi muallif ruakh, manba
Ha, lekin ma'lum bir qator tariflarning bir yoki bir nechta kodlari bilan etiketlanganligi haqida hech narsa yo'q, haqiqiy aloqalar yo'q. O'ylaymanki, joriy so'rovlar ma'nosini beradi.
qo'shib qo'ydi muallif tedski, manba
Ha, bu to'g'ri
qo'shib qo'ydi muallif tedski, manba

2 javoblar

Ushbu sehrlarni sinab ko'ring:

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

Bu T-SQL, afsus, lekin siz fikrni olasiz

0
qo'shib qo'ydi

Quyidagi skript sizga yordam berishi mumkin. "1111" uchun emas, balki barcha mumkin tariflarni oladi:

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
qo'shib qo'ydi