由于某些原因,我的客户没有跟踪他商店里的商品,他所做的是计算他每次拥有的产品,有些产品是每天的,有些是每周的,有些是每月的,无论如何,我有三个表格,看起来像这样
PRODUCT
------------------
| idPro | ProName|
------------------
| 1 | P1 |
| 2 | P2 |
| 3 | P3 |
------------------
STOCK
-------------------------
| idPro | idCount | Qty |
-------------------------
| 1 | 1 | 10 |
| 2 | 2 | 30 |
| 1 | 4 | 60 |
| 2 | 5 | 10 |
-------------------------
Count
------------------
| idCount | Date |
------------------
| 1 | 1100 |
| 2 | 1109 |
| 3 | 1505 |
| 4 | 1806 |
------------------
我想要获取产品的最后计数以及数量,换句话说,我想要让产品暂停计数(我检查最后计数是否超过一周或从未计数)就像
----------------------------
|ProName | LastCount | Qty |
----------------------------
| 1 | 1505 | 60 |
| 2 | 1806 | 10 |
| 3 | NULL | NULL|
----------------------------
我想到的是这个
USE StoTrackerBasic
GO
SELECT P.ProCode, P.ProName, MAX(R.CountDate) LastCount
FROM Product P
LEFT JOIN Stock as S ON P.idProduct = S.idProduct
INNER JOIN Count R ON R.idCount = S.idCount
-- WHERE R.CountDate > 100 OR R.CountDate IS NULL
GROUP BY P.ProName, P.ProCode
ORDER BY P.ProName
但无法添加数量
此外,我想值得一提的是,表 PRODUCT
可能有超过 1000 个产品,而 COUNT
表可能有一个三元组,因为客户端可能会执行 3 或 10 次计数一天涉及不同的产品,所以我猜我的查询会检查计数表中每一行的每个产品。
PS : 表计数上的日期是时间戳
最佳答案
您可以使用“OUTER APPLY”来收集最后一个相关项目。
DECLARE @Product TABLE ( idProduct INT , ProName VARCHAR(50) )
INSERT INTO @Product VALUES( 1, 'P1'), (2, 'P2'), (3, 'P3')
DECLARE @Stock TABLE ( idProduct INT, idCount INT, Qty INT )
INSERT INTO @Stock VALUES (1, 1, 10), (2, 2, 30), (1, 4, 60), (2, 5,10)
DECLARE @Count TABLE ( idCount INT , CountDate VARCHAR(20) )
INSERT INTO @Count VALUES (1, 1100), (2, 1109), (3, 1505), (4, 1806)
SELECT P.idProduct ProID, P.ProName, A.CountDate LastCount, A.Qty LastQty
FROM @Product P
OUTER APPLY(
SELECT TOP 1 R.CountDate, S.Qty
FROM
@Stock as S
INNER JOIN @Count R ON R.idCount = S.idCount
WHERE
P.idProduct = S.idProduct
ORDER BY
R.CountDate DESC
) AS A
ORDER BY P.ProName
如果 Stock 表有多条记录,则应根据优先级将额外的 order by 谓词添加到外部查询中。
关于sql - 如何获取具有最大值的行并且它与其他两个表相匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46111608/