SQL Select Distinct

时间:2011-12-05 15:13:32

标签: sql

在这里处理查询,但我在子项列中获得了多个子项。我想调整我的查询只显示一个Subitem。我拥有的PO表可能有也可能没有多个子项,这就是为什么它有时显示很多子项。

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

3 个答案:

答案 0 :(得分:0)

该列表中的每个结果都是不同的。某些字段可能有重复,但该结果集中没有两个完全相同的记录。

因此,例如,如果您只需要子项0S331500G0的一个结果,则需要指定要保留的记录以及要丢弃的记录。您希望结果集中的0S331500G0项报告STDCOST 0.62950.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的其他示例,您可能希望使用这些示例来指定在项目不相同的情况下如何处理数据。< / p>

答案 1 :(得分:0)

SELECT DISTINCT对您已有的内容没有任何影响。原因是您的子项目尽管具有相同的ID,但并不明显......您需要调用您如何选择 子项目的子项目。例如,一个简单的选择是采用最大stdcostnewcostPurchase Price(使用MAX聚合函数);但“简单”并不一定意味着“正确”!

答案 2 :(得分:0)

这取决于您想要确定要选择的众多子项中的哪一个。

在您的情况下,您的MasterTable已经具有StartItem和SubItem之间的1:many关系。这意味着您可以简单地预处理该表并从那里开始工作......

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

这假定MasterTable和PO_2_Months中的记录之间存在1:1的关系。如果它是1:很多,你会想要将GROUP BY放回去,并且可能在dbo.PO_2_months上使用SUM()或MAX()或其他东西。[购买价格]。