Sql-Server-2016

如果這個或那個適用,則從表中獲取值,但兩者都適用時不

  • July 1, 2020

我目前正在為一項看似簡單的任務而苦苦掙扎。

目標是根據客戶編號獲得相應的價格 - 或者 - 如果客戶編號在表中不存在,則為客戶價格組。我認為我的問題是這些值保存在同一個表中。該表如下所示(縮短):

Sales Code  | Item No | Unit price
----------------------------------
SC1         | 711111  | 345.12
SC2         | 711111  | 501.24
SC3         | 711111  | 242.70
CustomerNo1 | 711111  | 242.70
CustomerNo2 | 711111  | 250.00
SC1         | 711112  | 345.12
SC2         | 711112  | 501.24
SC3         | 711112  | 242.70
CustomerNo2 | 711112  | 250.00

我正在使用客戶編號的參數,並且我已經獲得了客戶的客戶價格組,如果客戶編號在銷售價格表中不可用。

到目前為止,我的程式碼的簡短片段:

-- Get the customer price group
SET @query = 
   'SELECT @CustomerPriceGroup = (CASE [Customer Price Group] WHEN '''' THEN ''SC1'' ELSE [Customer Price Group] END)
   FROM [customers] 
   WHERE [No] = ''' + @CustomerNo + ''''
EXEC sp_executesql @query, N'@CustomerPriceGroup NVARCHAR(3) OUTPUT', @CustomerPriceGroup = @CustomerPriceGroup OUTPUT

-- Get the item data
   SET @query = 'SELECT sp.[Sales Code] AS [SalesCode],
           i.[No] AS [ItemNo],
           i.[Name] AS [ItemName],
           sp.[Unit Price] AS [UnitPrice]
   FROM [items] i
   INNER JOIN [salesprices] sp ON i.[No] = sp.[ItemNo]
   WHERE (sp.[Sales Code] = ''' + @CustomerNo + ''' OR sp.[Sales Code] = ''' + @CustomerPriceGroup + ''')'

   EXEC (@query)

我已經嘗試使用 EXIST 或視窗函式(範例來自這裡https://stackoverflow.com/questions/15723326/if-exists-in-where-clause),但我沒有成功。我得到了沒有客戶價格組的客戶本身的價格,但如果沒有可用的客戶編號(總是沒有,兩者或只有客戶價格),我就沒有客戶價格組。

我需要獲取以下欄位:

  • 銷售程式碼
  • 項目編號
  • 項目名稱
  • 單價(根據銷售程式碼,CustomerNo 或銷售程式碼)
  • 按項目編號分組

我正在使用 Microsoft SQL Server 2016。

知道我該如何解決嗎?

BR拉菲

我很高興您找到了自己的答案,但我可以建議將其作為一種更清潔的替代方案嗎?作為獎勵,它也應該執行得更快。假設 SalesCode 和 ItemNo 存在唯一約束,通過兩次加入表並使用合併應該可以正常工作。

DECLARE @SalesPrice TABLE
   (
   SalesCode NVARCHAR(20) NOT NULL 
   , ItemNo NVARCHAR(10) NOT NULL
   , UnitPrice DECIMAL(10,2) NOT NULL
   )

INSERT INTO @SalesPrice
(SalesCode, ItemNo, UnitPrice)
VALUES ('SC1','711111',345.12)
   , ('SC2','711111',501.24)
   , ('SC3','711111',242.70)
   , ('CustomerNo1','711111',242.70)
   , ('CustomerNo2','711111',250.00)
   , ('SC1','711112',345.12)
   , ('SC2','711112',501.24)
   , ('SC3','711112',242.70)
   , ('CustomerNo2','711112',250.00)

DECLARE @Items TABLE
   (
   ItemNo NVARCHAR(10) NOT NULL
   , ItemName NVARCHAR(50) NOT NULL
   )

INSERT INTO @Items 
   (ItemNo, ItemName)
VALUES ('711111', 'Widget 1')
   , ('711112', 'Reverse Googah')

DECLARE @CustomerNo NVARCHAR(20) = 'CustomerNo1'
DECLARE @CustomerPriceGroup NVARCHAR(10) = 'SC1'

SELECT COALESCE(SP.SalesCode, SP2.SalesCode) AS SalesCode
   , SP.SalesCode 
   , SP2.SalesCode
   , I.ItemNo
   , I.ItemName 
   , COALESCE(SP.UnitPrice, SP2.UnitPrice) AS UnitPrice
FROM @Items AS I
   LEFT OUTER JOIN @SalesPrice AS SP ON SP.ItemNo = I.ItemNo AND (SP.SalesCode = @CustomerNo)
   LEFT OUTER JOIN @SalesPrice AS SP2 ON SP2.ItemNo = I.ItemNo AND (SP2.SalesCode = @CustomerPriceGroup)

引用自:https://dba.stackexchange.com/questions/270175