带条件的3表的SQL查询

时间:2019-02-25 14:01:03

标签: sql sql-server

我有3张桌子

DiscountHeader表

 HeaderID    HeaderName
 ------------------------
 1            DiscountA

DiscountLine表

 LineID    HeaderID    Min    Max   DiscountPercentage
 -----------------------------------------------
 1         1           0      1000       1% 
 2         1           1001   2000       2%

和Branch_Total

 CompanyID   HeaderID    Sales_Total      Discount
 ------------------------------------------------------
 B1          1              900              1%
 T2          1             1500              2%

还有公司表

 CompanyID    HeaderID
 ------------------------
 B1            1
 T2            1

基本上,我想根据每家公司的销售量给他们折扣。

每个公司都有一个折扣抬头ID,每个抬头都有行。显示他们将获得多少折扣。更多销售,更多折扣。

例如,CompanyId 1仅售出900,而他们的所有权只有1%,因为它小于1000。但是companyID 2售出1500,他们拥有了2%

到目前为止,我做到了

 SELECT *
 CASE 
      WHEN B.Sales_Total >V.Min THEN 1
 END AS R
 FROM Branch_Totals B
 JOIN Company H ON H.CompanyID = B.CompanyID 
 JOIN DiscountLine V ON H.VDHeaderID = V.HeaderID

但是当我说 其中R不为null。 IT无法正常工作。基本上“ AS R”是不可接受的。 我不确定如何将所有这些表与单个查询结合在一起。

1 个答案:

答案 0 :(得分:2)

您可以使用outer apply

SELECT B.*, H.*, v.discount
FROM Branch_Totals B JOIn
     Company H
     ON H.CompanyID = B.CompanyID OUTER APPLY
     (SELECT TOP (1) v.*
      FROM DiscountLine Vv
      WHERE H.VDHeaderID = V.HeaderID AND
            B.Sales_Total >= V.Min
      ORDER BY V.MIN DESC
     ) v;

我注意到您有min和max列,因此您也可以只使用join

SELECT *
FROM Branch_Totals B JOIN
     Company H 
     ON H.CompanyID = B.CompanyID JOIN
     DiscountLine V
     ON H.VDHeaderID = V.HeaderID AND
        B.Sales_Total BETWEEN v.MIN and v.MAX