Sql server 按最早日期排序的订单位置,不返回每个日期戳的记录
我有一个子查询,需要返回每个机架和箱子的总和(数量),以最早的日期(ASC)订购机架/箱子。每次我使用date字段对数据进行排序时,它都会返回每个日期的记录。我在SELECT语句中添加了日期字段以供参考。我该怎么做呢Sql server 按最早日期排序的订单位置,不返回每个日期戳的记录,sql-server,tsql,Sql Server,Tsql,我有一个子查询,需要返回每个机架和箱子的总和(数量),以最早的日期(ASC)订购机架/箱子。每次我使用date字段对数据进行排序时,它都会返回每个日期的记录。我在SELECT语句中添加了日期字段以供参考。我该怎么做呢 SELECT InventoryItems_1.ItemID, SUM(ISNULL(InventoryItems_1.QtyToStock, 0)) AS InvQty, InventoryItems_1.Rack, InventoryI
SELECT InventoryItems_1.ItemID,
SUM(ISNULL(InventoryItems_1.QtyToStock, 0)) AS InvQty,
InventoryItems_1.Rack,
InventoryItems_1.Bin,
InventoryItems_1.LocationID,
MIN(InventoryItems_1.Date),
Locations_1.LocationCode,
Locations_1.DescriptionMed
FROM dbo.InventoryItems AS InventoryItems_1
INNER JOIN dbo.Locations AS Locations_1 ON InventoryItems_1.LocationID = Locations_1.LocationID
WHERE(InventoryItems_1.OwnerDetailID IS NULL)
GROUP BY InventoryItems_1.ItemID,
InventoryItems_1.LocationID,
InventoryItems_1.Rack,
InventoryItems_1.Bin,
InventoryItems_1.Date,
Locations_1.LocationCode,
Locations_1.DescriptionMed
HAVING InventoryItems_1.ItemID = 10308
ORDER BY InventoryItems_1.LocationID,
InventoryItems_1.Date,
InventoryItems_1.Rack,
InventoryItems_1.Bin;
这是我的结果:
ID Qty Rack Bin Loc Date LocID
10308 35 21 02-Z 7 2018-10-22 14:48:33.000 WI
10308 52.5 21 02-Z 7 2018-10-23 08:18:44.000 WI
10308 87.5 18 01-Z 7 2018-10-23 12:19:09.000 WI
10308 87.5 23 01-B 7 2018-10-24 11:02:35.000 WI
10308 35 19 09-Z 7 2018-12-06 14:24:14.000 WI
10308 22.5 19 09-Z 7 2018-12-06 16:52:26.000 WI
10308 30 19 09-Z 7 2018-12-07 07:55:59.000 WI
10308 55 19 09-Z 7 2018-12-07 08:54:55.000 WI
10308 32.5 19 09-Z 7 2018-12-07 09:47:19.000 WI
10308 87.5 19 03-C 7 2018-12-07 11:36:20.000 WI
10308 72.5 19 10-Z 7 2018-12-07 13:17:03.000 WI
10308 15 19 10-Z 7 2018-12-07 14:30:38.000 WI
10308 32.5 18 07-A 7 2018-12-17 13:39:39.000 WI
10308 12.5 19 03-A 7 2018-12-17 14:48:57.000 WI
10308 42.5 19 03-A 7 2018-12-18 08:07:42.000 WI
10308 87.5 19 11-Z 7 2018-12-18 10:11:23.000 WI
10308 87.5 19 06-B 7 2018-12-18 12:08:17.000 WI
10308 87.5 18 03-Z 7 2018-12-26 13:40:34.000 WI
10308 55 21 05-Z 7 2018-12-26 14:48:58.000 WI
10308 32.5 21 05-Z 7 2018-12-27 07:49:27.000 WI
10308 87.5 19 01-B 7 2018-12-27 09:55:59.000 WI
10308 8 18 07-A 7 2018-12-28 09:40:11.000 WI
10308 0.5 18 08-B 7 2018-12-28 09:40:11.000 WI
10308 75.5 9 2018-11-27 11:55:17.000 NJ
10308 7 10 2018-10-24 08:28:26.000 TX
10308 2.5 10 2018-11-02 10:07:27.000 TX
10308 12.5 10 2018-11-02 14:36:57.000 TX
10308 10.5 10 2018-11-27 13:56:11.000 TX
这是我希望它看起来像排序最早的库存日期第一
ItemID InvQty Rack Bin Loc LocCode
10308 87.5 18 01-Z 7 WI
10308 87.5 18 03-Z 7 WI
10308 40.5 18 07-A 7 WI
10308 0.5 18 08-B 7 WI
10308 87.5 19 01-B 7 WI
10308 55 19 03-A 7 WI
10308 87.5 19 03-C 7 WI
10308 87.5 19 06-B 7 WI
10308 175 19 09-Z 7 WI
10308 87.5 19 10-Z 7 WI
10308 87.5 19 11-Z 7 WI
10308 87.5 21 02-Z 7 WI
10308 87.5 21 05-Z 7 WI
10308 87.5 23 01-B 7 WI
10308 75.5 9 NJ
10308 32.5 10 TX
您通过
InventoryItems_1.Date
字段进行分组,这就是为什么每个日期都会出现单独的行。将查询更改为“不按此分组”,并命名“最小日期”字段将允许您生成正确的输出。另外,如果您想将报告限制为只有一个ID,请将其放在WHERE子句中,而不是HAVING子句中。这将在执行分组计算等操作之前过滤记录,从而加快输出速度
SELECT InventoryItems_1.ItemID,
SUM(ISNULL(InventoryItems_1.QtyToStock, 0)) AS InvQty,
InventoryItems_1.Rack,
InventoryItems_1.Bin,
InventoryItems_1.LocationID,
MIN(InventoryItems_1.Date) As MinDate,
Locations_1.LocationCode,
Locations_1.DescriptionMed
FROM dbo.InventoryItems AS InventoryItems_1
INNER JOIN dbo.Locations AS Locations_1
ON InventoryItems_1.LocationID = Locations_1.LocationID
WHERE InventoryItems_1.OwnerDetailID IS NULL
AND InventoryItems_1.ItemID = 10308
GROUP BY InventoryItems_1.ItemID,
InventoryItems_1.LocationID,
InventoryItems_1.Rack,
InventoryItems_1.Bin,
Locations_1.LocationCode,
Locations_1.DescriptionMed
-- HAVING InventoryItems_1.ItemID = 10308
ORDER BY InventoryItems_1.LocationID,
MIN(InventoryItems_1.Date),
InventoryItems_1.Rack,
InventoryItems_1.Bin;
您通过
InventoryItems_1.Date
字段进行分组,这就是为什么每个日期都会出现单独的行。将查询更改为“不按此分组”,并命名“最小日期”字段将允许您生成正确的输出。另外,如果您想将报告限制为只有一个ID,请将其放在WHERE子句中,而不是HAVING子句中。这将在执行分组计算等操作之前过滤记录,从而加快输出速度
SELECT InventoryItems_1.ItemID,
SUM(ISNULL(InventoryItems_1.QtyToStock, 0)) AS InvQty,
InventoryItems_1.Rack,
InventoryItems_1.Bin,
InventoryItems_1.LocationID,
MIN(InventoryItems_1.Date) As MinDate,
Locations_1.LocationCode,
Locations_1.DescriptionMed
FROM dbo.InventoryItems AS InventoryItems_1
INNER JOIN dbo.Locations AS Locations_1
ON InventoryItems_1.LocationID = Locations_1.LocationID
WHERE InventoryItems_1.OwnerDetailID IS NULL
AND InventoryItems_1.ItemID = 10308
GROUP BY InventoryItems_1.ItemID,
InventoryItems_1.LocationID,
InventoryItems_1.Rack,
InventoryItems_1.Bin,
Locations_1.LocationCode,
Locations_1.DescriptionMed
-- HAVING InventoryItems_1.ItemID = 10308
ORDER BY InventoryItems_1.LocationID,
MIN(InventoryItems_1.Date),
InventoryItems_1.Rack,
InventoryItems_1.Bin;
您可以这样做:
SELECT
InventoryItems_1.ItemID
, ISNULL(InventoryItems_1.QtyToStock, 0) AS InvQty
, InventoryItems_1.Rack
, InventoryItems_1.Bin
, InventoryItems_1.LocationID
, InventoryItems_1.Date
, Locations_1.LocationCode
, Locations_1.DescriptionMed
FROM (
SELECT *, ROW_NUMBER() OVER(PARTITION BY ItemID, Bin, LocationID ORDER BY [Date] DESC) RN
FROM dbo.InventoryItems
) InventoryItems_1
INNER JOIN dbo.Locations AS Locations_1 ON InventoryItems_1.LocationID = Locations_1.LocationID
WHERE
InventoryItems_1.RN = 1
AND InventoryItems_1.OwnerDetailID IS NULL
AND InventoryItems_1.ItemID = 10308
ORDER BY InventoryItems_1.LocationID,
InventoryItems_1.Rack,
InventoryItems_1.Bin;
您可以这样做:
SELECT
InventoryItems_1.ItemID
, ISNULL(InventoryItems_1.QtyToStock, 0) AS InvQty
, InventoryItems_1.Rack
, InventoryItems_1.Bin
, InventoryItems_1.LocationID
, InventoryItems_1.Date
, Locations_1.LocationCode
, Locations_1.DescriptionMed
FROM (
SELECT *, ROW_NUMBER() OVER(PARTITION BY ItemID, Bin, LocationID ORDER BY [Date] DESC) RN
FROM dbo.InventoryItems
) InventoryItems_1
INNER JOIN dbo.Locations AS Locations_1 ON InventoryItems_1.LocationID = Locations_1.LocationID
WHERE
InventoryItems_1.RN = 1
AND InventoryItems_1.OwnerDetailID IS NULL
AND InventoryItems_1.ItemID = 10308
ORDER BY InventoryItems_1.LocationID,
InventoryItems_1.Rack,
InventoryItems_1.Bin;
您不能按未返回的列排序——此外,在这里按日期排序而不显示,用户或查看此数据的任何人都无法理解。这里的目标是什么?我认为您可以通过子句@scsimon从分组中删除inventoryitems\u 1.Date:此查询是选择列表的一部分。我希望用户从顶部选择最旧的库存。否则,机架/箱的顺序是随机的。@pascal sanchez:如果字段的顺序是按,则必须在group by或AGGRATE函数中包含该字段。您应该在cte中使用ROW_编号,以便只选择每个组中的“第一个”字段。您不能按未返回的列进行排序--此外,用户或查看此数据的任何人都无法理解在此处按日期订购而不显示。这里的目标是什么?我认为您可以通过子句@scsimon从分组中删除inventoryitems\u 1.Date:此查询是选择列表的一部分。我希望用户从顶部选择最旧的库存。否则,机架/箱的顺序是随机的。@pascal sanchez:如果字段的顺序是由,则必须在group by或AGGRATE函数中包含该字段。您应该在cte中使用ROW_编号,以便只选择每个组中的“第一个”。是的,这很有效,谢谢!我现在明白我做错了什么!ItemID筛选器仅用于此示例,否则它将返回数千条记录。是的,这很有效,谢谢!我现在明白我做错了什么!ItemID筛选器仅用于此示例,否则它将返回数千条记录。