簡體   English   中英

在子查詢中獲取 DISTINCT 值

[英]Getting a DISTINCT value in a subquery

我最近一直在嘗試將 First() 函數從 MS Access 轉換為 T-SQL。 現在 First() 在 T-SQL 中不存在,所以我不得不探索一些替代方案。 我找到了似乎可以完成這項工作的 First_Value 函數。

但是,請使用以下代碼:

SELECT [Order Transactions Table].[Job Number],
   [Order Transactions Table].OutstandingBalance,
   [Order Transactions Table].[Accepted Quantity],
   MRPStockOut.MRPStockOutID,
   MRPStockOut.[Date],
   MRPStockOut.[Units],
   MRPHeader.MRPHeaderID,
   FIRST_VALUE(MRPSupplier.StockCode) OVER (PARTITION BY MRPSupplier.StockCode ORDER BY MRPSupplier.StockCode) AS FirstOfStockCode,
   --(SELECT TOP (1) MRPSupplier.StockCode ORDER BY [Order Transactions Table].[Job Number]) AS FirstOfStockCode,
   MRPHeader.MaterialDescription,
   MRPStockOut.StockQtyOut,
   MRPHeader.WeightPerUnit * MRPStockOut.StockQtyOut AS [Weight],
   LiveWIPStockAllocatedToJobsPrices.PurchPriceEach,
   LiveWIPStockAllocatedToJobsPrices.StockPriceEach,
   LiveWIPStockAllocatedToJobsPrices.PriceEach,
   (IIF(ISNULL(LiveWIPStockAllocatedToJobsPrices.PurchPriceEach,0) > 0,
    ISNULL(LiveWIPStockAllocatedToJobsPrices.PurchPriceEach,0),
    ISNULL(LiveWIPStockAllocatedToJobsPrices.StockPriceEach,0)) +0) * MRPStockOut.StockQtyOut AS TotalPrice

FROM [Order Transactions Table]
INNER JOIN MRPStockOut ON [Order Transactions Table].[Job Number] = MRPStockOut.JobNumber
INNER JOIN MRPHeader ON MRPStockOut.MRPHeaderID = MRPHeader.MRPHeaderID
INNER JOIN LiveWIPStockAllocatedToJobsPrices ON MRPHeader.MRPHeaderID = 
LiveWIPStockAllocatedToJobsPrices.MRPHeaderID
INNER JOIN MRPSupplier ON MRPHeader.MRPHeaderID = MRPSupplier.MRPHeaderID
GROUP BY
[Order Transactions Table].[Job Number],
[Order Transactions Table].OutstandingBalance,
[Order Transactions Table].[Accepted Quantity],
MRPStockOut.MRPStockOutID,
MRPStockOut.[Date],
MRPStockOut.[Units],
MRPHeader.MRPHeaderID,
MRPSupplier.StockCode,
MRPHeader.MaterialDescription, 
MRPStockOut.StockQtyOut,
MRPHeader.WeightPerUnit * MRPStockOut.StockQtyOut,
LiveWIPStockAllocatedToJobsPrices.PurchPriceEach,
LiveWIPStockAllocatedToJobsPrices.StockPriceEach,
LiveWIPStockAllocatedToJobsPrices.PriceEach,
(IIF(ISNULL(LiveWIPStockAllocatedToJobsPrices.PurchPriceEach,0) > 0,
ISNULL(LiveWIPStockAllocatedToJobsPrices.PurchPriceEach,0),
ISNULL(LiveWIPStockAllocatedToJobsPrices.StockPriceEach,0)) +0) * MRPStockOut.StockQtyOut
Having [Order Transactions Table].OutstandingBalance > 0

特別是在 MRPSupplier 中選擇第一個值的行。 (訪問中的第一個(MRPSupplier.StockCode)

FIRST_VALUE(MRPSupplier.StockCode) OVER (PARTITION BY MRPSupplier.StockCode ORDER BY MRPSupplier.StockCode) AS FirstOfStockCode

現在這個值正在返回我期望的值,但是,在相同的 [Job Number] 下,某些 Jobs 返回了 2 條記錄而不是 1 條記錄。 這是因為其中一個重復作業返回FirstOfStockCode = Null而另一個具有預期值。

這是一個問題,因為這是一個子查詢,我在上面的查詢中有一個 SUM,這給了我一個不正確的結果,因為由於重復記錄,TotalPrice 被求和了兩次。 我怎樣才能得到它,以便我只從該列中收到一個 Distinct 值?

編輯:

當前結果: 當前結果

預期結果是上面唯一的第 2 條記錄,第一個 NULL 記錄不應出現在選擇列表中。

編輯2:

這是更多記錄的另一個屏幕截圖(546 行 - 這比我在 MS Access 中得到的多兩行): 更多記錄

同樣,這兩個空值記錄不應該存在,因為它們是重復的 編輯 3:用戶 @Isaac 已設法幫助我解決此問題。 請參閱他的回答中的評論線程。

嘗試更換這一行...

FIRST_VALUE(MRPSupplier.StockCode) OVER (PARTITION BY MRPSupplier.StockCode ORDER BY MRPSupplier.StockCode) AS FirstOfStockCode,

有了這個...

FIRST_VALUE(MRPSupplier.StockCode) OVER (ORDER BY MRPSupplier.StockCode) AS FirstOfStockCode,

我相信 PARTITION BY 子句會導致返回額外的行。 如果這導致返回具有 NULL 值的行,請像這樣添加DESC ...

FIRST_VALUE(MRPSupplier.StockCode) OVER (ORDER BY MRPSupplier.StockCode DESC) AS FirstOfStockCode,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM