2017-07-06 80 views
1

分组依据(名称)和排序依据(日期)我得到了一种包含内部选择查询的大型查询。我的目标是通过现场调用产品编号(这不是唯一的并且多次出现),然后按日期对所有记录进行分组。两个选择查询

我在查询的末尾添加了Order By日期,似乎工作正常。查询按日期顺序生成所有记录,但记录未按ProductNumber分组。

这里是

ProductId Manufacturer  ProductNumber  Date 
1   Kellog    H1   05/05/2017 
5   Nestle    H1   05/01/2017 
8   Nutmeg    H1   04/30/2017 
9   Highland    H3   04/09/2017 
10   Houston    H1   04/15/2017 
11   Miami     H3   04/12/2017 

我试图让输出看起来像下面

ProductId Manufacturer  ProductNumber  Date 
1   Kellog    H1   05/05/2017 
5   Nestle    H1   05/01/2017 
8   Nutmeg    H1   04/30/2017 
10   Houston    H1   04/15/2017 
9   Highland    H3   04/09/2017 
11   Miami     H3   04/12/2017 

因此,数据的可视化样品,我将如何被列字段组(ProductNumber )与分组,然后按日期排序? 在查询中,我添加了按日期排序。当我通过ProductNumber添加组时,错误消息是要求我将内部选择中的所有字段添加到组中。我是否真的需要选择所有的字段(真正的查询中有很多字段)?必须有更好的解决方案。

这里是我的查询(只是一个示例)到目前为止

SELECT DISTINCT TOP 100 *, 
FROM (SELECT DISTINCT NP.ManufacuturerId, 
         C.ManufacuturerName, 
         IR2.ProductNumber, 
         NP.Field1, 
         NP.Field2, 
         NP.Field3, 
         NP.Field4, 
         CN.C2Date      CN.CompanyNotificationId, 
         NPR.NotificationProcessName, 
         Cast(NP.CompanyId AS VARCHAR(15)) 
         + NPR.NotificationProcessName AS 'CompanyIdAndProcess', 
         CC.UserId, 
         NT.NotificationTypeName, 
         CC.EmailAddress, 
         IsRegistered = CASE 
             WHEN C.IsRegistered = 1 THEN 'Yes' 
             ELSE 'No' 
             END, 
     FROM ProductDetails NP 
       INNER JOIN Manufactuers C 
         ON C.ManufacuturerId = NP.ManufacturerId) Q 
ORDER BY CN.C2DateDESC; 
+0

,会是什么结果,如果'11迈阿密H3 4月12日/ 2017'日期是'05/05/2017'? –

+0

是不是合乎逻辑,当你按产品编号分组和选择查询中的一些其他列应汇总? SQL中有不同的聚集函数,如min,max,Avg等,您可以根据您的要求在选择查询中使用它们,也可以按这些列进行分组。 –

回答

3

你什么叫“分组”真的订购。

按产品编号,日期排序。

1

我觉得你的问题是,你正试图通过包括分组数据中的字段顺序,并不总是相同的,例如:

1  Kellog   H1   05/05/2017 
5  Nestle   H1   05/01/2017 

如果按ProductNumber您想按日期排序的分组很可能是您的数据库引擎无法知道订购(5月5日或5月1日?)的价值。因此,您需要做的是指定分组时使用哪个值,例如使用MAX或MIN函数。

快速样品:

SELECT Count(*) AS Products, ProductNumber, MAX(Date) AS maxdate 
FROM  Table 
GROUP BY ProductNumber 
ORDER BY maxdate;