这是我的SQL代码:
SELECT
T.Template_Id, T.TemplateName,
CONVERT(NVARCHAR(MAX), T.CatalogDescription),
T.MasterNo, T.Customer_Id,
O.Quantity, O.Cost
FROM
Template as T
INNER JOIN
[Order] AS O ON T.Template_Id = O.Template_Id
ORDER BY
O.Cost
我的问题是,我选择的字段都不是唯一的,我希望T.Template_Id
为DISTINCT
,我无法找到办法。其他专栏并不重要,只要他们在那里并且T.Template_Id
列是DISTINCT
(没有重复)。
答案 0 :(得分:1)
其他领域并不重要。
如果这是真的 * ,你可以这样做:
SELECT T.Template_Id, MAX(T.TemplateName) As TemplateName,
CONVERT(NVARCHAR(MAX),MAX(T.CatalogDescription)) As CatalogDescription,
MAX(T.MasterNo) As MasterNo, MAX(T.Customer_Id) As CustomerId,
MAX(O.Quantity) As Quantity, MAX(O.Cost) As Cost
FROM Template as T
INNER JOIN [Order] as O ON T.Template_Id=O.Template_Id
GROUP BY T.Template_Id
ORDER BY MAX(O.Cost)
只要您使用相同<的字段,查看哪些对应的Order
字段并不重要的问题就不那么常见了。 / em>订单记录。在这种情况下,您可以这样做:
SELECT T.Template_Id, T.TemplateName,
CONVERT(NVARCHAR(MAX),T.CatalogDescription),
T.MasterNo, T.Customer_Id, O.Quantity, O.Cost
FROM Template as T
CROSS APPLY (SELECT TOP 1 * FROM [Order] WHERE T.Template_Id=[Order].Template_Id) As O
ORDER BY O.Cost
当然,假设至少在Template
表中的记录已根据ID唯一。这样做的好处还在于,只需在嵌套查询中添加ORDER BY
子句,就可以更轻松地选择选择顺序。
* 提示:事实证明这种情况很少发生。你几乎总是会发现它在某些方面确实很重要,因为至少有一个领域。
答案 1 :(得分:1)
通常,您要对该列进行GROUP BY,但这需要为所有其他列指定聚合函数。在你的情况下可能有用,因为你说其他专栏并不重要(这让我想知道为什么他们会被退回)。
SELECT T.Template_Id, Max(T.TemplateName),
Max(CONVERT(NVARCHAR(MAX),T.CatalogDescription)), Max(T.MasterNo), Max(T.Customer_Id),
Max(O.Quantity), Max(O.Cost)
FROM Template as T INNER JOIN [Order] as O ON T.Template_Id=O.Template_Id
GROUP BY T.Template_Id
ORDER BY O.Cost
答案 2 :(得分:0)
SQL不允许您仅聚合数据集中的特定字段,它们必须全部聚合。如果它确实像VFP和允许这样的其他数据库引擎那样,只需选择一行来填充其他值。
如果你想要实现我相信你的目标,那么你需要一个字段的所有不同值的列表,只需要其他字段的样本。
在使用Rank和Row_Number等窗口函数之前,我已经完成了这项工作,具体取决于我想要完成的工作。这样,您还可以选择样品,例如按OrderDate Desc订购,以便从客户的最新订单中获取样品字段。