2011-12-05 20 views
0

ここでクエリを処理していますが、サブアイテム列に複数のサブアイテムがあります。 1つのサブアイテムのみを表示するようにクエリを調整したい。私が持っているPOテーブルには、複数のサブアイテムがある場合とない場合があります。SQL Select Distinct

SELECT 
    dbo.MasterTable.StartItem, 
    dbo.MasterTable.SubItem, 
    dbo.MasterTable.STDCOST, 
    ISNULL(dbo.PO_2_months.[Purchase Price], dbo.MasterTable.STDCOST) AS NewCost, 
    dbo.PO_2_months.[Purchase Price] 
FROM dbo.MasterTable LEFT OUTER JOIN 
    dbo.PO_2_months ON dbo.MasterTable.SubItem = dbo.PO_2_months.Item 
GROUP BY 
    dbo.MasterTable.SubItem, 
    dbo.MasterTable.STDCOST, 
    ISNULL(dbo.PO_2_months.[Purchase Price], dbo.MasterTable.STDCOST), 
    dbo.MasterTable.StartItem, 
    dbo.PO_2_months.[Purchase Price] 
HAVING (dbo.MasterTable.StartItem = 'FO6534') 

enter image description here

+1

複数の副明細の場合、どの副明細が必要ですか?最初の1つ? – danihp

答えて

0

そのリスト内の各結果は区別されます。いくつかのフィールドの重複があるかもしれませんが、その結果セットに全く同じレコードが2つありません。

たとえば、サブアイテム0S331500G0の結果が1つだけの場合は、保存するレコードと破棄するレコードを指定する必要があります。結果セット内の0S331500G0アイテムにSTDCOST0.6295または0.6470と報告されますか?またはその平均?限り、あなたはそれを指定するよう

、あなたは明確な選択することができるようになります:

SELECT DISTINCT 
    dbo.MasterTable.StartItem, 
    dbo.MasterTable.SubItem, 
    AVG(dbo.MasterTable.STDCOST), 
    AVG(dbo.MasterTable.NewCost), 
    AVG(dbo.MasterTable.PurchasePrice) 
... 

MIN()MAX()SUM()は、あなたがデータを処理する方法を指定するために使用することがAggregate Functionsの他の例であります項目は区別されません。

0

SELECT DISTINCTあなたが既に持っているものに影響を与えません。その理由は、同じIDを持っているにもかかわらず、あなたのサブアイテムが区別できないからです... サブアイテムをどのように選択するかについて電話をする必要があります。サブアイテム。たとえば、簡単なオプションは、stdcost,newcostPurchase PriceMAX集約関数を使用)の最大値を取ることです。 「簡単」は必ずしも「正しい」という意味ではありません!

0

多くのサブ項目の中からどれを選択するかは、owに依存します。

あなたの場合、MasterTableにはすでにStartItemとSubItemの間に1:多くの関係があります。 MasterTableとPO_2_Monthsでレコード間の1の関係:これは、あなたは、単にテーブルと作業

SELECT 
    dbo.MasterTable.StartItem, 
    dbo.MasterTable.SubItem, 
    dbo.MasterTable.STDCOST, 
    ISNULL(dbo.PO_2_months.[Purchase Price], dbo.MasterTable.STDCOST) AS NewCost, 
    dbo.PO_2_months.[Purchase Price] 
FROM 
(
    SELECT StartItem, MIN(SubItem) FROM dbo.MasterTable GROUP BY StartItem WHERE StartItem = 
'FO6534' 
) 
    AS reduced_MasterTable 
INNER JOIN 
    dbo.MasterTable 
    ON MasterTable.StartItem = reduced_MasterTable.StartItem 
    AND MasterTable.SubItem = reduced_MasterTable.SubItem 
LEFT OUTER JOIN 
    dbo.PO_2_months 
    ON dbo.MasterTable.SubItem = dbo.PO_2_months.Item 

...そこからこれは1を想定し、プロセスを事前ことができることを意味します。 1:たくさんの場合はGROUP BYを元に戻し、おそらくSUM()やMAX()などをdbo.PO_2_months [購入価格]に使用します。