麻烦 运行 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