【问题标题】:Cross join on subquery子查询的交叉连接
【发布时间】:2013-06-11 09:31:41
【问题描述】:

费用表

FeeId(PK)managerId    amount    Type    
1        50           100       1
1        50           10000     39
1        50           50000     2
1        50           50000     3
1        50           50000     4

经理表

FeeId(FK)Split    managerId
1        70       68

期望的结果:

FeeId    managerId    amount    Type    
1        50           30        1
1        68           70        1
1        50           3000      39
1        68           7000      39
1        50           15000     2
1        68           35000     2
1        50           15000     3
1        68           35000     3
1        50           15000     4
1        68           35000     4

这个数据集只是一条记录,我的数据中还有很多 FeeId。交叉连接不会考虑到这一点。我基本上想根据feeId交叉加入每个经理。

然后金额列重新计算为 managerid 68,50 分别为 70,30。

如何对每个子集进行交叉连接:WHERE f.feeId = m.feeId 以获得所需的结果?

由于经理表将收取超过 1 的费用,因此结果不正确的交叉连接示例:

SELECT 
    f.feeId,
    (cast(m.split as decimal) / 100) * f.amount as amount
FROM
    dbo.fee f
    CROSS JOIN dbo.manager m

【问题讨论】:

  • 这适用于哪个 RDBMS?
  • @Goat_CO SQL Server 2008

标签: sql cross-join


【解决方案1】:

据我了解,您正试图在两位经理之间分配fee 中的金额。以下查询通过交叉连接一个附加表来实现此目的,该表用于为每一行选择数据。

select f.feeid,
       (case when n.n = 1 then f.managerid
             when n.n = 2 then m.managerid
        end) as managerid,
       (case when n.n = 1 then f.amount * (100 - m.split)/100
             when n.n = 2 then f.amount * m.split/100
        end) as amount, f.type
from fee f cross join
     manager m cross join
     (select 1 as n union all select 2) as n;

作为评论,这似乎是一个非常不寻常的数据结构。

【讨论】:

  • 这有点不寻常,但我认为一旦你理解了数据结构,它就会变得有意义。费用表是一张高大的桌子,已经有一个经理。我们不会从源头更改原始数据,而是让我们端的用户能够添加另一个经理并将金额分成一个百分比。目前有 504 名经理需要应用于费用表。因此我的问题是,因为直接交叉连接会将所有 504 名经理应用于所有费用。
【解决方案2】:

看来这应该可行:

SELECT   f.feeId, ,f.managerID, (cast(m.split as decimal) / 100) * f.amount as amount, f.type
FROM fee f
JOIN manager m
ON f.FeeID = m.FeeID
AND f.managerID = m.managerID

【讨论】:

  • 我认为你缺少的是 managerId 没有加入任何事情。但我希望经理(基于 FeeId)交叉加入费用表。
猜你喜欢
  • 2012-12-31
  • 2020-03-12
  • 1970-01-01
  • 2011-08-15
  • 2016-06-14
  • 2013-04-04
  • 1970-01-01
  • 2015-03-18
  • 2019-03-03
相关资源
最近更新 更多