Sql 基于交集表以逻辑方式创建模板
我不知道该如何描述这个问题,但我正试图就关税的代码给出建议。我在甲骨文公司做这件事 以下是我的数据库结构:Sql 基于交集表以逻辑方式创建模板,sql,oracle,intersection,Sql,Oracle,Intersection,我不知道该如何描述这个问题,但我正试图就关税的代码给出建议。我在甲骨文公司做这件事 以下是我的数据库结构: CODE ( CODEID *PK NCHAR(10) ) CODETARIFF ( TARIFFNO NCHAR(15) *PK *FK CODEID NCHAR(10) *PK *FK ) TARIFF ( TARIFFNO NCHAR(15) *PK ) 因此,我试图在逻辑上为应该分配给关税的代码制作模板。我想象着展示一些大致如下的东西:6关税也
CODE (
CODEID *PK NCHAR(10)
)
CODETARIFF (
TARIFFNO NCHAR(15) *PK *FK
CODEID NCHAR(10) *PK *FK
)
TARIFF (
TARIFFNO NCHAR(15) *PK
)
因此,我试图在逻辑上为应该分配给关税的代码制作模板。我想象着展示一些大致如下的东西:6关税也有这两个与之相关的代码
我尝试了这个方法,但是为每个代码返回的计数并没有真正显示模板,它们只显示了当一个代码与我指定的两个代码同时出现时的发生率
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吗?试试这些魔法:
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,但您会明白的希望下面的脚本可以帮助您。它将获得所有可能的关税,不仅仅是“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;
也许一些预期结果的样本数据可以让这一点更清楚?这是正确的吗事件的顺序是:1用户创建一个新的费率;2用户使用一些现有代码“ABC”和“DEF”标记电费;3该应用程序为用户提供了一些关于其他代码的建议,用户可能希望使用这些代码标记电费。这些建议的逻辑是,应用程序会找到既有标记为“ABC”又有“DEF”的现有关税,并查看在这些现有关税中最常见的其他代码。如果这是正确的,那么你的问题在我看来是正确的。对于每个代码,它显示了有多少现有的关税被标记。是的,但没有任何东西表明一定数量的关税被标记了一个或多个代码,没有真正的联系。我想现在的问题是有道理的。我想我明白了。您之所以建议使用“GHI”和“JKL”,并不是因为它们分别用于两个具有“ABC”和“DEF”的关税,而是因为它们两个一起用于两个具有“ABC”和“DEF”的关税?那么,如果关税3333也被标记为MNO,您希望显示什么?