SQL多重计数

时间:2016-06-15 18:48:51

标签: sql-server database sql-server-2008

你能解释一下我如何获得这个特定的表结果吗?

我的4个查询分别单独获取每列。

我不确定方法在这里我是否将最后3个查询嵌入到第一个查询中,或者在查询之间使用联合。

请记住,每个人的信息都不匹配,我认为Union或Union All不会有用。

派生表是否是更好的方法。对不起,我的SQL技能非常基础。

我还需要保留“调整”的能力。我的管理员决定在以后排除某些记录的where子句(你们会习惯那些人!)

某些改变where子句的能力在解决方案中会很好。

只是为了让你更烦恼; - )

查询表需要看起来有点像这样

Company Department  Total_B Total_R Total_Ret   RushJobs
ACME    LSD     2   100     24      3           

四个查询(单独工作以获取上面的每一列都在这里(我已经在相应的Group By和where子句中省略了I_Department在第二次查询时只映射到Department。

-- Total B count query from B
Select  Company,Department, count(*) as Total_B  from B
Group by Company,Department
Order BY Company;

--Select h count from h table
    Select count(*) as Total_R, I_Department from H
    where  L ='re-box' 
    Group By IDepartment

-- Select r count 
    Select Company,Department,Count (B_Number) AS Total_Ret
    from P Inner Join B ON P.Record_Number = B.B_Number
    where P.Request_Date > = 'SOMEDATE' and P.Request_Date < = 'SOMEDATERANGE'
    Group By Company,Department

-- Select Rush Jobs
    Select Company,Department,Count (*) as RushJobs 
    from Res
    Inner Join B on Res.Item_Number = B.B_Number 
    where Res.Setup_Date >= 'Somedate' and Res.Setup_Date<= 'somedaterange' 
    and Res.Res_Priority = '1'
     Group By Company,Department

所以决赛桌

<table><TBODY>
<TR>
<TH>Company</TH>
<TH>Department</TH>
<TH>Total_B</TH>
<TH>Total_R </TH>
<TH>Total_Ret</TH>
<TH>RushJobs</TH></TR>
<TR>
<TD>ACME</TD>
<TD>LSD</TD>
<TD>100</TD>
<TD>2</TD>
<TD>4</TD>
<TD>1</TD></TR></TBODY></table>

1 个答案:

答案 0 :(得分:0)

一种方法是使用Common表表达式(CTE),也就是声明..

这允许每个查询继续独立,允许你轻松twerk(我打算纠正那个错误,但它太搞笑了)每个的where子句并结合结果返回1个记录与4列

-- Total B count query from B
With B as (
Select  Company,Department, count(*) as Total_B  from B
Group by Company,Department
Order BY Company),

H as (
--Select h count from h table
Select count(*) as Total_R, I_Department from H
where  L ='re-box' 
Group By IDepartment),

R as (-- Select r count 
Select Company,Department,Count (B_Number) AS Total_Ret
from P Inner Join B ON P.Record_Number = B.B_Number
where P.Request_Date > = 'SOMEDATE' and P.Request_Date < = 'SOMEDATERANGE'
Group By Company,Department),

RushJobs as (-- Select Rush Jobs
Select Company,Department,Count (*) as RushJobs 
from Res
Inner Join B on Res.Item_Number = B.B_Number 
where Res.Setup_Date >= 'Somedate' and Res.Setup_Date<= 'somedaterange' 
and Res.Res_Priority = '1'
Group By Company,Department)

SELECT coalesce(B.Company, R.Company, RJ.Company)
     , coalesce(B.Department,R.Department, Rj.Department)
     , B.Total_B, H.Total_R, R.Total_Ret, RJ.RushJobs
FROM
FULL OUTER JOIN  H
   on B.Company = H.Company
FULL OUTER JOIN  R
   on B.company = R.Company
  and B.Department = R.Department
FULL OUTER JOIN  RushJobs RJ
   on H.company = RJ.Company
  and H.Department = RJ.Department