用于检索进程最新状态的SQL查询
我试图跟踪多个提案的状态,这些提案将处于“草稿”、“已提交”或“已批准”状态。提案在批准之前可以在草稿和提交之间来回多次,因此,创建了一个连接表,以按proposalPackageID、approvalTypeID和reviewDate跟踪提案状态的更改。查询需要返回各种状态的计数 我已经接近了下面的查询(多亏了这个网站和谷歌上的各种帖子——没有什么东西真正击中了要害),但我遗漏了一些造成错误计数的内容用于检索进程最新状态的SQL查询,sql,sql-server,Sql,Sql Server,我试图跟踪多个提案的状态,这些提案将处于“草稿”、“已提交”或“已批准”状态。提案在批准之前可以在草稿和提交之间来回多次,因此,创建了一个连接表,以按proposalPackageID、approvalTypeID和reviewDate跟踪提案状态的更改。查询需要返回各种状态的计数 我已经接近了下面的查询(多亏了这个网站和谷歌上的各种帖子——没有什么东西真正击中了要害),但我遗漏了一些造成错误计数的内容 SELECT COUNT(distinctified.approvalType
SELECT COUNT(distinctified.approvalTypeID) AS MyCount, distinctified.approvalTypeID, refProposalApprovalType.approvalDescription
FROM (SELECT r.proposalPackageID, r.approvalTypeID, MAX(reviewedDate) AS MRD
FROM proposalReviewAction as r INNER JOIN proposalPackage ON r.proposalPackageID = proposalPackage.proposalPackageID
WHERE proposalPackage.proposalCallID = 7 -- 7=MAIN 8=Sat
GROUP BY r.approvalTypeID, r.proposalPackageID) as distinctified INNER JOIN proposalPackage ON distinctified.proposalPackageID = proposalPackage.proposalPackageID
INNER JOIN refProposalApprovalType ON distinctified.approvalTypeID = refProposalApprovalType.approvalTypeID
WHERE (proposalPackage.proposalCallID = 7) -- 7=MAIN 8=Sat
group by distinctified.approvalTypeID, refProposalApprovalType.approvalDescription
HAVING (distinctified.approvalTypeID = 25) or (distinctified.approvalTypeID = 50) --25 = submitted 50 = approved
order by approvalTypeID
抱歉,我必须离开,我忘记粘贴模式和数据
CREATE TABLE [dbo].[proposalPackage](
[proposalPackageID] [int] IDENTITY(1,1) NOT NULL,
[title] [varchar](500) NULL,
[proposalCallID][int] NULL,
[startDate] [datetime] NULL,
[endDate] [datetime] NULL,
) ON [PRIMARY]
INSERT INTO [dbo].[proposalPackage]
([title]
,[proposalCallID]
,[startDate]
,[endDate])
VALUES
('test proposal 1',7,'2018-10-01','2019-09-30')
,('test proposal 2',7,'2018-10-01','2019-09-30')
,('test proposal 3',7,'2018-10-01','2019-09-30')
,('test proposal 4',7,'2018-10-01','2019-09-30')
,('test proposal 5',7,'2018-10-01','2019-09-30')
,('test proposal 6',7,'2018-10-01','2019-09-30')
,('test proposal 7',7,'2018-10-01','2019-09-30')
,('test proposal 8',7,'2018-10-01','2019-09-30')
,('test proposal 9',7,'2018-10-01','2019-09-30')
,('test proposal 10',7,'2018-10-01','2019-09-30')
CREATE TABLE [dbo].[refProposalApprovalType](
[approvalTypeID] [int] NOT NULL,
[approvalDescription] [varchar](50) NULL
) ON [PRIMARY]
INSERT INTO [dbo].[refProposalApprovalType]
([approvalTypeID]
,[approvalDescription])
VALUES
(5,'Rejected by Approving Official')
,(10,'Rejected by PM')
,(15,'Rejected by Executive Review Board')
,(25,'Submitted for Approval')
,(50,'Approved by Approving Official')
,(75,'Approved by PM')
,(100,'Approved by Executive Review Board')
CREATE TABLE [dbo].[proposalReviewAction](
[proposalReviewActionID] [int] IDENTITY(1,1) NOT NULL,
[proposalPackageID] [int] NULL,
[approvalTypeID] [int] NULL,
[comments] [varchar](2000) NULL,
[reviewedByID] [int] NULL,
[reviewedDate] [datetime] NULL
) ON [PRIMARY]
INSERT INTO [dbo].[proposalReviewAction]
([proposalPackageID]
,[approvalTypeID]
,[comments]
,[reviewedByID]
,[reviewedDate])
VALUES
(1,25,'Submit',101,'2018-05-01')
,(2,25,'Submit',102,'2018-05-01')
,(3,25,'Submit',103,'2018-05-01')
,(4,25,'Submit',104,'2018-05-01')
,(5,25,'Submit',105,'2018-05-01')
,(1,10,'Incomplete',1001,'2018-05-10')
,(2,10,'Incomplete',1001,'2018-05-10')
,(3,10,'Incomplete',1001,'2018-05-10')
,(4,50,'Approved',1001,'2018-05-10')
,(1,25,'Resubmit',101,'2018-05-21')
,(2,25,'Resubmit',102,'2018-05-21')
,(3,25,'Resubmit',103,'2018-05-21')
,(7,25,'Submit',107,'2018-05-22')
,(1,10,'REJECTED',1001,'2018-05-22')
,(2,10,'REJECTED',1001,'2018-05-22')
,(3,10,'Approved',1001,'2018-05-22')
,(1,25,'Resubmit',101,'2018-05-23')
,(8,25,'Submit',108,'2018-05-23')
,(10,25,'Submit',110,'2018-05-24')
,(3,15,'REJECTED',1010,'2018-05-25')
我希望看到
MyCount approvalTypeID approvalDescription
6 25 Submitted for Review
1 50 Approved by Approving Official
非常感谢您的帮助……我认为您的子查询没有正确获取每个包的最新状态 如果可能,使用
ROW\u NUMBER()
window函数可以很容易地识别每个包的最新状态行,同时保留该行的其他列值
以下查询将为您获取每个包的最新状态:
SELECT ls.*
FROM (
SELECT r.proposalPackageID,
r.approvalTypeID,
RowNr = ROW_NUMBER() OVER (PARTITION BY r.proposalPackageID ORDER BY r.reviewedDate DESC)
FROM proposalReviewAction AS r
JOIN proposalPackage AS pp ON pp.proposalPackageID = r.proposalPackageID
WHERE pp.proposalCallID = 7) AS ls -- 7=MAIN 8=Sat
WHERE ls.RowNr = 1
AND ls.approvalTypeID IN (25, 50); -- 25 = sumbitted 50 = approved
请注意,其中ls.RowNr=1
,它是删除旧状态的过滤器。确保(25,50)中approvalTypeID的过滤器位于子查询的外部,以便我们获得每个包的真实最新状态
然后,连接到其他表以从这些表返回附加列以匹配您喜欢的任何输出格式是一项简单的任务。DDL和示例数据将极大地帮助解决这个问题。我们不知道您的模式。请提供表格的结构(如CREATE TABLE
语句)。此外,我们不知道您的数据,因此请同时提供样本数据(如插入到语句中)。为了让我们更容易了解您想要什么以及问题所在,还请包括您通过提供的样本数据获得的实际结果,说明此结果错误的位置,并包括应使用提供的示例数据生成的预期结果。不要只转储已损坏的查询,并期望了解您正在尝试执行的操作!!!你的桌子结构在哪里???样本输入???预期产量???学习如何提问。添加了更多信息…谢谢,现在效果很好。表名前面的#是什么意思?#=临时表,我用来检查答案。我会把它清理干净的。所以你提供的解决方案非常有效,再次感谢。然而,管理层现在需要一些额外的细节(当然他们需要,对吧?)。我将查询放入一个“EXISTS”语句中,并添加了一些连接,得到了一组看起来不错的数据。问题是,当我运行上面的查询时,它返回一个包含95个建议的列表。由于该查询现在位于“EXISTS”语句中,我希望它返回95个或更少的建议。我得了112分。。。我这里没有足够的空间插入新的查询,我该怎么做?你可以单独发布一个问题吗,从你的评论中了解完整情况有点困难?我做了。。。很抱歉给你带来困惑。。。而且,我发现了。。。