Sql-Server-2016
如果這個或那個適用,則從表中獲取值,但兩者都適用時不
我目前正在為一項看似簡單的任務而苦苦掙扎。
目標是根據客戶編號獲得相應的價格 - 或者 - 如果客戶編號在表中不存在,則為客戶價格組。我認為我的問題是這些值保存在同一個表中。該表如下所示(縮短):
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)