SQL视图-获取单价,默认价格和客户价格

时间:2018-07-25 23:13:46

标签: sql sql-server sql-server-2008 views sql-view

我希望有人可以在此SQL视图中为我提供帮助。

我有一个屏幕,您可以在其中向订单添加产品。此订单是针对可能没有该商品特殊价格的客户的。

本质上,我只追求3位数字:

  • 操作员输入的产品单价
  • 产品的默认价格(标准价目表)
  • 此产品的客户特惠价(可能不存在)

为简化起见,我有以下表格

订单行

  • OrderId
  • ProductId
  • ProductVariationId(可以为空)

价目表

  • RatecardId
  • RatecardName

RatecardClient (默认主价目表为ID 1)

  • RatecardClientId
  • RatecardId
  • ClientId

RatecardProduct

  • RatecardProductId
  • ProductId
  • ProductVariationId(可以为空)

产品具有ID,但也可以具有产品变体ID

我要为 OrderLine 创建一个视图,其中包含输入价格,默认价目表价格和该产品的特价。

我想要一个给我的视图:

产品ID 来自“ OrderLine”的单价 RatecardId = 1(永远存在)中与“ Ratecard”相关的“ RatecardProduct”中的RatecardPrice

ClientRatecardPrice(取决于是否有现有的价目表以及此价目表中客户/产品/版本的条目)

我真的很希望有人可以让我从这里开始,因为我真的很努力!

提前谢谢!

1 个答案:

答案 0 :(得分:0)

我对价格列在哪里以及RateCardProduct如何加入RateCard做了一些假设。如果您将实际的表定义包括在内,则去除多余的列会更好。但是假设您可以在我的表def中看到这些假设,那么此查询应该可以为您提供所需的信息。

create table ClientOrder(OrderID int, ClientID int)
create table OrderLine(OrderId int,ProductId int,ProductVariationId int, UnitPrice decimal(10,2))
create table Ratecard(RateCardId int,RatecardName varchar(50)) -- has default 1
create table RateCardClient(RatecardClientId int,RatecardId int,ClientId int) 
create table RateCardProduct(RatecardProductId int, RateCardId int, ProductId int, ProductVariationId int, Price decimal(10,2))

select Clientorder.ClientID, ClientOrder.OrderID, OrderLine.ProductID, OrderLine.ProductVariationId,
    OrderLine.UnitPrice as UnitPrice,
    P1.Price as RateCardPrice,
    P2.Price as ClientRateCardPrice
from ClientOrder
Join OrderLine on OrderLine.OrderID=ClientOrder.OrderID
-- Get the default price
join RateCardProduct P1 on P1.RateCardID=1 
    and P1.ProductId=OrderLine.ProductId
    and isnull(P1.ProductVariationID,0)=isnull(OrderLine.ProductVariationID,0)
-- Get the customer specific price
left join RateCardClient on RateCardClient.ClientID=ClientOrder.ClientID
left join RateCardProduct P2 on P2.RateCardID=RateCardClient.RateCardID 
    and P2.ProductId=OrderLine.ProductId
    and isnull(P2.ProductVariationID,0)=isnull(OrderLine.ProductVariationID,0)