麻烦 运行 sql 中的复杂查询?
Trouble running a complex query in sql?
我是 SQL 服务器的新手,刚开始使用它。我正在尝试创建一个按部门显示出勤率的 table。
所以首先我 运行 这个查询:
SELECT CrewDesc, COUNT(*)
FROM database.emp
INNER JOIN database.crew on sim1 = sim2
GROUP BY CrewDesc
这给出了一个 table 这样的:
Accounting 10
Marketing 5
Economics 20
Engineering 5
Machinery 5
Tech Support 10
然后我运行另一个查询:
SELECT DeptDescription, COUNT(*)
FROM database.Attendee
GROUP BY DeptDescription
这给了我所有参加会议的人的结果
Accounting 8
Marketing 5
Economics 15
Engineering 10
Tech Support 8
然后我通过 SELECT Datepart(ww, GetDate()) as CurrentWeek
得到一年中的当前周 为了让这个例子更简单,我们假设这将是第“2”周。
现在我要创建它的方法是每个步骤 table 但这似乎是浪费。有没有一种方法可以在查询中合并到 tables?所以最后我想要一个像这样的 table
Total# Attd Week (Total*Week) Attd/(Total*week)%
Accounting 10 8 2 20 8/20
Marketing 5 5 2 10 5/10
Economics 20 15 2 40 15/40
Engineering 5 10 2 10 10/10
Machinery 5 NULL 2 10 0/10
Tech Support 10 8 2 20 8/20
尝试这样的事情
SELECT COALESCE(a.crewdesc,b.deptdescription),
a.total,
b.attd,
Datepart(ww, Getdate()) AS week,
total * Datepart(ww, Getdate()),
b.attd/(a.total*Datepart(ww, Getdate()))
FROM (query 1) a
FULL OUTER JOIN (query 2) b
ON a.crewdesc = b.deptdescription
我假设你的查询是正确的——你没有提供关于你的模型的真实信息,所以我无法知道。它们看起来是错误的,因为相同的数据在一个 table 中称为 CrewDesc 而在另一个中称为 Dept。另外 join sim1 = sim2 对我来说似乎很奇怪。在任何情况下,鉴于您发布的查询,这都将起作用。
With TAttend as
(
SELECT CrewDesc, COUNT(*) as TotalNum
FROM database.emp
INNER JOIN database.crew on sim1 = sim2
GROUP BY CrewDesc
), Attend as
(
SELECT DeptDescription, COUNT(*) as Attd
FROM database.Attendee
GROUP BY DeptDescription
)
SELECT CrewDesc as Dept, TotalNum, ISNULL(Attd, 0) as Attd ,Datepart(ww, GetDate()) as Week,
CASE WHEN ISNULL(Attd, 0) > 0 THEN 0
ELSE ISNULL(Attd, 0) / (TotalNum * Datepart(ww, GetDate()) ) END AS Percent
FROM TAttend
LEFT JOIN Attend on CrewDesc = DeptDescription
好的,请注意,我在下面的建议是基于您现有的确切查询 - 当然还有其他构建方法可能性能更高,但从功能上讲,这应该可以满足您的要求。此外,它还说明了恰好与您的请求相关的不同连接类型的关键特性,以及内联视图(又名嵌套查询),这些都是 SQL 语言整体中的一项超级强大的技术。
select t1.CrewDesc, t1.Total, t2.Attd, t3.Week,
(t1.Total*t3.Week) as Total_x_Week,
case when isnull(t1.Total*t3.Week, 0) = 0 then 0 else isnull(t2.Attd, 0) / isnull(t1.Total*t3.Week, 0) end as PercentageAttd
from (
SELECT CrewDesc, COUNT(*) AS Total
FROM database.emp INNER JOIN database.crew on sim1 = sim2
GROUP BY CrewDesc
) t1
left outer join /* left outer to keep all rows from t1 */ (
SELECT DeptDescription, COUNT(*) AS Attd
FROM database.Attendee GROUP BY DeptDescription
) t2
on t1.CrewDesc = t2.DeptDescription
cross join /* useful when adding a scalar value to all rows */ (
SELECT Datepart(ww, GetDate()) as Week
) t3
order by t1.CrewDesc
祝你好运!
WITH Total AS ( SELECT CrewDesc, COUNT(*) AS [Count]
FROM database.emp
INNER JOIN database.crew on sim1 = sim2
GROUP BY CrewDesc
),
Attd AS ( SELECT DeptDescription, COUNT(*) AS [Count]
FROM database.Attendee
GROUP BY DeptDescription
)
SELECT COALESCE(CrewDesc,DeptDescription) AS [Dept],
Total.[Count] AS [Total#],Attd.[Count] AS [Attd],
Total.[Count] * Datepart(ww, GetDate()) AS [(Total*Week)],
CAST(Attd.[Count] AS VARCHAR(10))+'/'+ CAST((Total.[Count] * Datepart(ww, GetDate()))AS VARCHAR(10)) AS [Attd/(Total*week)%]
FROM Total INNER JOIN Attd ON Total.CrewDesc = Attd.DeptDescription
我是 SQL 服务器的新手,刚开始使用它。我正在尝试创建一个按部门显示出勤率的 table。
所以首先我 运行 这个查询:
SELECT CrewDesc, COUNT(*)
FROM database.emp
INNER JOIN database.crew on sim1 = sim2
GROUP BY CrewDesc
这给出了一个 table 这样的:
Accounting 10
Marketing 5
Economics 20
Engineering 5
Machinery 5
Tech Support 10
然后我运行另一个查询:
SELECT DeptDescription, COUNT(*)
FROM database.Attendee
GROUP BY DeptDescription
这给了我所有参加会议的人的结果
Accounting 8
Marketing 5
Economics 15
Engineering 10
Tech Support 8
然后我通过 SELECT Datepart(ww, GetDate()) as CurrentWeek
得到一年中的当前周 为了让这个例子更简单,我们假设这将是第“2”周。
现在我要创建它的方法是每个步骤 table 但这似乎是浪费。有没有一种方法可以在查询中合并到 tables?所以最后我想要一个像这样的 table
Total# Attd Week (Total*Week) Attd/(Total*week)%
Accounting 10 8 2 20 8/20
Marketing 5 5 2 10 5/10
Economics 20 15 2 40 15/40
Engineering 5 10 2 10 10/10
Machinery 5 NULL 2 10 0/10
Tech Support 10 8 2 20 8/20
尝试这样的事情
SELECT COALESCE(a.crewdesc,b.deptdescription),
a.total,
b.attd,
Datepart(ww, Getdate()) AS week,
total * Datepart(ww, Getdate()),
b.attd/(a.total*Datepart(ww, Getdate()))
FROM (query 1) a
FULL OUTER JOIN (query 2) b
ON a.crewdesc = b.deptdescription
我假设你的查询是正确的——你没有提供关于你的模型的真实信息,所以我无法知道。它们看起来是错误的,因为相同的数据在一个 table 中称为 CrewDesc 而在另一个中称为 Dept。另外 join sim1 = sim2 对我来说似乎很奇怪。在任何情况下,鉴于您发布的查询,这都将起作用。
With TAttend as
(
SELECT CrewDesc, COUNT(*) as TotalNum
FROM database.emp
INNER JOIN database.crew on sim1 = sim2
GROUP BY CrewDesc
), Attend as
(
SELECT DeptDescription, COUNT(*) as Attd
FROM database.Attendee
GROUP BY DeptDescription
)
SELECT CrewDesc as Dept, TotalNum, ISNULL(Attd, 0) as Attd ,Datepart(ww, GetDate()) as Week,
CASE WHEN ISNULL(Attd, 0) > 0 THEN 0
ELSE ISNULL(Attd, 0) / (TotalNum * Datepart(ww, GetDate()) ) END AS Percent
FROM TAttend
LEFT JOIN Attend on CrewDesc = DeptDescription
好的,请注意,我在下面的建议是基于您现有的确切查询 - 当然还有其他构建方法可能性能更高,但从功能上讲,这应该可以满足您的要求。此外,它还说明了恰好与您的请求相关的不同连接类型的关键特性,以及内联视图(又名嵌套查询),这些都是 SQL 语言整体中的一项超级强大的技术。
select t1.CrewDesc, t1.Total, t2.Attd, t3.Week,
(t1.Total*t3.Week) as Total_x_Week,
case when isnull(t1.Total*t3.Week, 0) = 0 then 0 else isnull(t2.Attd, 0) / isnull(t1.Total*t3.Week, 0) end as PercentageAttd
from (
SELECT CrewDesc, COUNT(*) AS Total
FROM database.emp INNER JOIN database.crew on sim1 = sim2
GROUP BY CrewDesc
) t1
left outer join /* left outer to keep all rows from t1 */ (
SELECT DeptDescription, COUNT(*) AS Attd
FROM database.Attendee GROUP BY DeptDescription
) t2
on t1.CrewDesc = t2.DeptDescription
cross join /* useful when adding a scalar value to all rows */ (
SELECT Datepart(ww, GetDate()) as Week
) t3
order by t1.CrewDesc
祝你好运!
WITH Total AS ( SELECT CrewDesc, COUNT(*) AS [Count]
FROM database.emp
INNER JOIN database.crew on sim1 = sim2
GROUP BY CrewDesc
),
Attd AS ( SELECT DeptDescription, COUNT(*) AS [Count]
FROM database.Attendee
GROUP BY DeptDescription
)
SELECT COALESCE(CrewDesc,DeptDescription) AS [Dept],
Total.[Count] AS [Total#],Attd.[Count] AS [Attd],
Total.[Count] * Datepart(ww, GetDate()) AS [(Total*Week)],
CAST(Attd.[Count] AS VARCHAR(10))+'/'+ CAST((Total.[Count] * Datepart(ww, GetDate()))AS VARCHAR(10)) AS [Attd/(Total*week)%]
FROM Total INNER JOIN Attd ON Total.CrewDesc = Attd.DeptDescription