三表连接sql server以获取最新版本和计数
我试图统计具有特定状态的记录数 第一个表称为反馈,其结构如下:三表连接sql server以获取最新版本和计数,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我试图统计具有特定状态的记录数 第一个表称为反馈,其结构如下: +------------+---------+--------+ | FeedbackID | Version | Status | +------------+---------+--------+ | 1 | 1 | Open | +------------+---------+--------+ | 2 | 1 | Open | +------------+
+------------+---------+--------+
| FeedbackID | Version | Status |
+------------+---------+--------+
| 1 | 1 | Open |
+------------+---------+--------+
| 2 | 1 | Open |
+------------+---------+--------+
| 2 | 1.1 | Open |
+------------+---------+--------+
| 1 | 1.3 | Open |
+------------+---------+--------+
| 1 | 1.3 | Closed |
+------------+---------+--------+
第二个投影
+-----------+------------+-----------------+
| ProjectID | FeedbackID | FeedbackVersion |
+-----------+------------+-----------------+
| 53 | 1 | 1.1 |
+-----------+------------+-----------------+
| 23 | 2 | 1.1 |
+-----------+------------+-----------------+
| 24 | 2 | 1 |
+-----------+------------+-----------------+
| 76 | 2 | 1.1 |
+-----------+------------+-----------------+
| 76 | 1 | 1.3 |
+-----------+------------+-----------------+
第三个项目
+-----------+--------------+
| ProjectID | Project_Name |
+-----------+--------------+
| 53 | Test |
+-----------+--------------+
| 23 | Test Project |
+-----------+--------------+
| 24 | Feedback |
+-----------+--------------+
| 76 | Class |
+-----------+--------------+
我使用这三个查询从前两个表中获取最新版本,我想将它们全部编译到第三个表中,但不确定如何将它们全部连接起来
-- GET Latest Feedback FROM CSLL.Feedback
SELECT fb.ID, fb.Version, fb.Status
FROM CSLL.Feedback fb
INNER JOIN (
SELECT ID, MAX(Version) Version
FROM CSLL.Feedback
GROUP BY ID
) MaxVer ON fb.ID = MaxVer.ID AND fb.Version = MaxVer.Version;
-- GET Latest Project FROM CSLL.ProjectID
SELECT Proj.ProjectID, Proj.FeedbackID, Proj.FeedbackVersion
FROM CSLL.ProjectID Proj
INNER JOIN (
SELECT FeedbackID, MAX(FeedbackVersion) Version
FROM CSLL.ProjectID
GROUP BY FeedbackID
) MaxVer ON Proj.FeedbackID = MaxVer.FeedbackID AND Proj.FeedbackVersion = MaxVer.Version;
SELECT
Project_ID
,Project_Name
,(SELECT COUNT(FeedbackID) FROM CSLL.ProjectID WHERE CSLL.ProjectID.ProjectID = CSLL.Projects.Project_ID) AS cnt
FROM CSLL.Projects;
我试图通过将打开/关闭记录的数量连接在一起来获得分数值。这些也可以在单独的列中完成
+-----------+--------------+---------------+-----------------+
| ProjectID | Project_Name | Count of Open | Count of Closed |
+-----------+--------------+---------------+-----------------+
| 53 | Test | 0 | 0 |
+-----------+--------------+---------------+-----------------+
| 23 | Test Project | 1 | 0 |
+-----------+--------------+---------------+-----------------+
| 24 | Feedback | 0 | 0 |
+-----------+--------------+---------------+-----------------+
| 76 | Class | 1 | 1 |
+-----------+--------------+---------------+-----------------+
更新代码 我已经用鼠标把这三张桌子连在一起了。现在我只需要分组并计算每个项目中的状态数
-- GET Latest Project FROM CSLL.ProjectID
SELECT Proj.ProjectID
,(SELECT Project_Name FROM CSLL.Projects WHERE CSLL.Projects.Project_ID = proj.ProjectID) AS ProjectName
,(SELECT Status FROM CSLL.Feedback WHERE CSLL.Feedback.ID = Proj.FeedbackID AND CSLL.Feedback.Version = Proj.FeedbackVersion) AS Status
,(SELECT COUNT(Status) FROM CSLL.Feedback WHERE CSLL.Feedback.ID = Proj.FeedbackID AND CSLL.Feedback.Version = Proj.FeedbackVersion) AS cnt
FROM CSLL.ProjectID Proj
INNER JOIN (
SELECT FeedbackID, MAX(FeedbackVersion) Version
FROM CSLL.ProjectID
GROUP BY FeedbackID
) MaxVer ON Proj.FeedbackID = MaxVer.FeedbackID AND Proj.FeedbackVersion = MaxVer.Version;
我只是努力把它们组合在一起,以得到总数
更新
这更有意义吗?我稍微改变了一下表的结构,因为它更符合逻辑
+-----------+--------------+--------+-------+
| ProjectID | Project_Name | Status | Count |
+-----------+--------------+--------+-------+
| 23 | Test Project | Open | 1 |
+-----------+--------------+--------+-------+
| 76 | Class | Open | 1 |
+-----------+--------------+--------+-------+
| 76 | Class | Closed | 1 |
+-----------+--------------+--------+-------+
SELECT Proj.ProjectID
,(SELECT Project_Name FROM CSLL.Projects WHERE CSLL.Projects.Project_ID = proj.ProjectID) AS ProjectName
,(SELECT Status FROM CSLL.Feedback WHERE CSLL.Feedback.ID = Proj.FeedbackID AND CSLL.Feedback.Version = Proj.FeedbackVersion) AS Status
,COUNT(Proj.ProjectID) AS cnt
FROM CSLL.ProjectID Proj
INNER JOIN (
SELECT FeedbackID, MAX(FeedbackVersion) Version
FROM CSLL.ProjectID
GROUP BY FeedbackID
) MaxVer ON Proj.FeedbackID = MaxVer.FeedbackID AND Proj.FeedbackVersion = MaxVer.Version
GROUP BY Proj.ProjectID
表格结构的简图。我正试图总结一下情况
前两名都是项目
反馈项被输入到项目中
我想得到在每个状态下分配给每个项目的反馈项的数量。我也只对版本最高的反馈感兴趣
仍然有很多模棱两可之处,但根据您目前的描述 首先让我们转换反馈表 此数据集仅提供最新版本以及与“打开”和“关闭”对应的两列:
SELECT
FeedbackID, FeedbackVersion,
CASE WHEN Status='Open' THEN 1 ELSE 0 END As OpenCount
CASE WHEN Status='Closed' THEN 1 ELSE 0 END As ClosedCount
FROM Feedback F
WHERE FeedbackVersion = (
SELECT MAX(FeedbackVersion)
FROM Feedback FM
WHERE FM.FeedbackID = F.FeedbackID
)
现在,我们将其加入到项目中:
SELECT P.ProjectID, SUM(OpenCount), SUM(ClosedCount)
FROM ProjectID P
INNER JOIN
(
SELECT
FeedbackID, FeedbackVersion,
CASE WHEN Status='Open' THEN 1 ELSE 0 END As OpenCount
CASE WHEN Status='Closed' THEN 1 ELSE 0 END As ClosedCount
FROM Feedback F
WHERE FeedbackVersion = (
SELECT MAX(FeedbackVersion)
FROM Feedback FM
WHERE FM.FeedbackID = F.FeedbackID
)
) MaxVersion
ON P.FeedbackID=MaxVersion.FeedbackID
AND P.FeedbackVersion=MaxVersion.FeedbackVersion
GROUP BY P.ProjectID
对于旧版本的
ProjectID
记录,您想做什么还不清楚。i、 e.如果项目id 7仅存在于ProjectID
中,而不存在于旧版本中,则它将不会出现在此查询中。请显示最终结果的外观。@VladimirBaranov抱歉,第三个表是它的外观。我现在已经更正了,以显示我试图达到的结果,还有第三张表。我不明白你是如何得到这些数字的。例如,projectd=76
,那么3
来自哪里?4
来自哪里?请使用提供的示例数据解释所需的逻辑,而不是显示不符合您需要的尝试代码。是的,这将使它更容易-逐步完成您如何得出这些数字的过程。从您的示例数据中,我看不出您如何根据项目id 76获得3个打开的、4个关闭的版本,这些版本是如何实现的?我们似乎没有Projectd=76的所有样本数据。如果我们只考虑PrimeDeD=76,那么在最新版本中有三个开放的反馈记录,还是有三个开放的反馈记录,而不考虑版本?第一个示例表只有两条与feedbackid2对应的记录。你能提供足够的样本数据来重现projectid 76吗?当我尝试运行第一个查询时,我在关键字“CASE”附近得到了不正确的语法。我忘记了一个逗号。我会修好的