【问题标题】:SQL mutliple countSQL 多次计数
【发布时间】:2016-06-15 18:48:51
【问题描述】:

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

我的 4 个查询分别单独获取每一列也在下面。

我不确定这里的方法是将最后 3 个查询嵌套到第一个查询中还是在查询之间使用联合。

请记住,每个信息中的信息并不真正匹配,我认为 Union 或 Union All 不会有用。

派生表会是更好的方法吗?抱歉,我的 SQL 技能相当基础。

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

一些改变 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>

【问题讨论】:

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


【解决方案1】:

一种方法是使用公用表表达式 (CTE) 又名 with 语句..

这允许每个查询继续保持独立,让您可以轻松地调整每个查询的 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

【讨论】:

  • 经过进一步审查,您不仅仅是返回计数,因此我们必须进行那些完整的外部联接,而不是交叉联接加入公司和部门(尽管 H 似乎没有一家公司),我们可能不得不合并名称,因为我们不知道每个连接中将存在哪些公司部门......
  • 谢谢 xQbert 我忘了说这是 sql 2000 所以我相信没有'WITH'。
  • 是否在 SQL 2005 中添加了?我不知道
  • Aug... 它被标记为 SQL 2008,所以我假设... 而不是您可以将每个视图创建为“VIEW”,然后 1 个视图将它们捆绑在一起。这就是我在 2000 年的做法。是的,它是在 2005 年添加的 stackoverflow.com/questions/954016/…
  • 如果您使用联合,则同一部门/公司会有多行。您必须加入他们才能在同一行获取数据(或者我想,您可以使用 union 并选择 max 来教授公司/部门的总分组。但是如果不了解“H”如何联系,我真的不能要有信心。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-17
  • 1970-01-01
相关资源
最近更新 更多