sql - 如何获取具有最大值的行并且它与其他两个表相匹配?

标签 sql sql-server

由于某些原因,我的客户没有跟踪他商店里的商品,他所做的是计算他每次拥有的产品,有些产品是每天的,有些是每周的,有些是每月的,无论如何,我有三个表格,看起来像这样

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/

相关文章:

sql - 如何在 SQL Server 2005 中使用表数据备份特定表

mysql - SQL 调用临时表中的列

sql - 如何在 SQL Server 上强制 SELECT 阻塞?

sql-server - 管理测试数据: Can you enlist all db connections into a single transaction?

php - 我想对members表中的每个成员进行SQL查询

mysql - 我怎样才能获得我的技术在此查询中的最后位置?

mysql - 如何避免程序中出现 "Illegal mix of collations for operation ' concat'"

sql-server - 如何让 SQL Server Management Studio 在出现错误时停止处理?

sql - T-SQL : Round to nearest 15 minute interval

sql-server - 可以提取存储在 XML 中的列中的 *distinct* 键(跨所有行)吗?