三表连接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”附近得到了不正确的语法。我忘记了一个逗号。我会修好的