Sql server 使用不同的'组合两个查询;从';表,但类似';加入';桌子

Sql server 使用不同的'组合两个查询;从';表,但类似';加入';桌子,sql-server,Sql Server,我试图将两个查询合并到一个结果集中 问题1: SELECT t1.evalID, t2.[Order], COUNT(t2.StepID) AS 'Total Categories' FROM Evals t1 JOIN Steps t2 ON t1.TemplateID = t2.TemplateID JOIN GradingCats t3 ON t2.StepID = t3.StepID GROUP BY t1.EvalID, t2.[Order] ORDER BY t2.[Order]

我试图将两个查询合并到一个结果集中

问题1:

SELECT t1.evalID, t2.[Order], COUNT(t2.StepID) AS 'Total Categories'
FROM Evals t1
JOIN Steps t2 ON t1.TemplateID = t2.TemplateID 
JOIN GradingCats t3 ON t2.StepID = t3.StepID 
GROUP BY t1.EvalID, t2.[Order]
ORDER BY t2.[Order]
问题2:

SELECT t4.EvaluatorID, t6.StepID, t6.[Order], COUNT(t4.Grade) AS 'Grades Entered'
FROM Grading t4
JOIN GradingCats t5 ON t4.GradingCatID = t5.GradingCatID 
JOIN Steps t6 ON t5.StepID = t6.StepID
GROUP BY t6.StepID, t4.EvaluatorID, t6.[Order]
我的最终目标是确定评估的哪些步骤缺少分数

编辑(样本数据): 问题#1

问题2


从第一个查询开始,该查询显示了与EVAL关联的所有步骤,您可以左外连接第二个查询,查询右侧为NULL的步骤将是缺少等级的步骤

为了做到这一点,您的表格中必须有某种方式将
评分
链接到
评估
。从你发布的代码中看,这个专栏并不明显,但我假设它在那里。也许是通过
GradingCats

在简短的psuedo代码中,仅说明我的意思:

SELECT ...
FROM Evals e
INNER JOIN Steps s ON e.TemplateID = s.TemplateID 
LEFT OUTER JOIN Grading g ON g.EvalID = e.EvalID  --use whatever means you have to show which Eval a Grade is from
LEFT OUTER JOIN Steps gs ON {join to Grading through GradingCats as in your second query}
WHERE gs.StepID IS NULL
在分析此查询的结果时,每个评估的所有步骤都将在
s.StepID
中,当同一行的
gs.StepID
为空时,这意味着该步骤没有得到分数

请注意,您不希望在此查询中执行任何分组,因为您需要行级分析。

一位同事(比我更了解数据)稍微修改了我的查询:

SELECT query1.stepID, Categories, Graded
FROM
(
    SELECT rs.stepid, COUNT(c.category) AS 'Categories'
    FROM Evals e
    JOIN RunScriptSteps rs ON e.TemplateID = rs.TemplateID
    JOIN GradingCats c ON rs.StepID = c.StepID
    WHERE EvalID = *(someNumber)*
    GROUP BY rs.stepid
)AS query1
LEFT JOIN
(
    SELECT s.StepID, COUNT(Grade) AS 'Graded'
    FROM Grading g
    JOIN GradingCats c ON g.GradingCatID = c.GradingCatID
    JOIN Steps s ON c.StepID = s.StepID
    WHERE EvalID = *(someNumber)*
    GROUP BY s.stepid
) AS query2
ON query1.stepid = query2.stepid
ORDER BY stepid ASC

这不像一个
UNION ALL
那么简单,是吗?如果没有,示例数据和期望的结果可能会有所帮助。另一方面,我建议尽快改掉使用别名的习惯,如
t1
t2
,…
t6
。您需要有类似的列(数据类型和计数。并在所有查询之间进行并集。不太确定这是否是并集。听起来更像是外部联接,但这是基于问题最后一句的猜测。没有样本数据和所需结果,问题不清楚,无法回答。@TabAlleman更正…我尝试了并集。我还尝试了一些外部联接作为示例好吧,但显然不是正确的。
SELECT ...
FROM Evals e
INNER JOIN Steps s ON e.TemplateID = s.TemplateID 
LEFT OUTER JOIN Grading g ON g.EvalID = e.EvalID  --use whatever means you have to show which Eval a Grade is from
LEFT OUTER JOIN Steps gs ON {join to Grading through GradingCats as in your second query}
WHERE gs.StepID IS NULL
SELECT query1.stepID, Categories, Graded
FROM
(
    SELECT rs.stepid, COUNT(c.category) AS 'Categories'
    FROM Evals e
    JOIN RunScriptSteps rs ON e.TemplateID = rs.TemplateID
    JOIN GradingCats c ON rs.StepID = c.StepID
    WHERE EvalID = *(someNumber)*
    GROUP BY rs.stepid
)AS query1
LEFT JOIN
(
    SELECT s.StepID, COUNT(Grade) AS 'Graded'
    FROM Grading g
    JOIN GradingCats c ON g.GradingCatID = c.GradingCatID
    JOIN Steps s ON c.StepID = s.StepID
    WHERE EvalID = *(someNumber)*
    GROUP BY s.stepid
) AS query2
ON query1.stepid = query2.stepid
ORDER BY stepid ASC