2013-06-27 27 views
1
SELECT part_number, 
    price, 
    (Select max(sent_to_t) AS 'T' From [CIMSDB].[dbo].[price] where sent_to_t < '06/04/2013' Group by part_number) 

FROM [CDB].[dbo].[part]PAB Inner Join [CDB].[dbo].[price] PR 
    ON PA.part_id = PR.part_id 
Order By part_number 

我想要做的是獲取零件清單和他們的價格,最近的send_to_t日期是在6/4之前。我目前recieving - 「錯誤消息MS SQL Server SQL組使用max()時出錯。 Msg 164

服務器:消息164,15級,狀態1,行 每個GROUP BY表達式必須至少包含一個 列不是外部引用。」

+1

該錯誤告訴您「price」表中沒有'part_number'列 - 也許您的意思是不同的列。或者您可能打算使用外部查詢中'part'表的列 - 但我們不知道哪一列,因爲我們沒有您的表或數據,也不知道您期望實現的結果。 –

+1

哪個版本的SQL Server? – gbn

+1

版本-2008。這是正確的,part_number來自零件表。我試圖通過part_numbrer對它進行分組,以便返回一個列表,如Part |價格| T | 55 | 2.5 | 2012-01-12我想要的是每個部分在6/04/13之前的最後價格。 – Eric

回答

2

根本不需要MAX(這與上面的主要查詢不相關,因此是錯誤)。即使相關,它也會爲您提供最近的某個日期前的價格,而不是該日期的價格。它只會提供最近的價格與未連接的日期。

你問(我的粗體)

得到部分的列表,以及它們的價格,因爲這是以前 6/4

這給最近 send_to_t日期你最近的一個部分的價格06/04/2013
基本上,「每組最高1」但帶有日期過濾器)

SELECT 
     part_number, 
     price, 
     sent_to_t 
    FROM 
     (
     SELECT 
      part_number, 
      price, 
      sent_to_t, 
      ROW_NUMBER() OVER (PARTITION BY part_number ORDER BY sent_to_t DESC) AS rn 
     FROM 
      [CDB].[dbo].[part] PAB 
      Inner Join 
      [CDB].[dbo].[price] PR ON PAB.part_id = PR.part_id 
     WHERE 
      sent_to_t < '06/04/2013' 
     ) X 
WHERE 
    X.rn = 1 
ORDER BY 
    part_number; 

注意06/04/2013含糊不清:是6月4日還是6月4日?您應該使用yyyymmdd以確保安全

+1

現在是6月4日,謝謝。請注意,您已撥打[CDB]。[dbo]。[part] PAB,但後來將其稱爲PA。一旦匹配它的工作。 – Eric