2015-07-05 35 views
1

我在表GAontime中有以下数据。 OrgEinheit指部门和GALaufzeit是通过时间:带有计数和Microsoft SQL Server 2012中的条件的嵌套SQL查询

CREATE TABLE GAontime 
    ([Auftragsart] varchar(9), 
    [GAZurueckIST] varchar(23), 
    [GALaufzeit] int, 
    [OrgEinheit] varchar(9), 
    [GAErteilungsJahr] int 
    ); 

INSERT INTO GAontime 
    ([Auftragsart], [GAZurueckIST], [GALaufzeit], [OrgEinheit], [GAErteilungsJahr]) 
VALUES 
    ('Gutachten', '2003-10-02 00:00:00.000', 2, 'FE11', 2003), 
    ('Gutachten', '2003-10-09 00:00:00.000', 2, 'FE12', 2003), 
    ('Gutachten', '2003-11-13 00:00:00.000', 3, 'FE12', 2003), 
    ('Gutachten', '2006-12-01 00:00:00.000', 1045, 'FO11', 2004), 
    ('Gutachten', '2003-11-18 00:00:00.000', 4, 'FE11', 2003), 
    ('Gutachten', '2003-11-25 00:00:00.000', 6, 'FE12', 2003), 
    ('Gutachten', '2003-12-11 00:00:00.000', 3, 'FE11', 2003), 
    ('Gutachten', '2003-12-10 00:00:00.000', 2, 'FE12', 2003), 
    ('Gutachten', '2003-12-19 00:00:00.000', 1, 'FE11', 2003), 
    ('Gutachten', '2004-01-08 00:00:00.000', 1, 'FE11', 2004), 
    ('Gutachten', '2004-02-25 00:00:00.000', 34, 'FE11', 2004), 
    ('Gutachten', '2004-03-19 00:00:00.000', 57, 'FE12', 2004), 
    ('Gutachten', '2004-02-25 00:00:00.000', 35, 'FE11', 2004), 
    ('Gutachten', '2004-08-12 00:00:00.000', 94, 'FO1', 2004), 
    ('Gutachten', '2004-02-05 00:00:00.000', 1, 'FE11', 2004), 
    ('Gutachten', '2004-02-12 00:00:00.000', 6, 'FE12', 2004), 
    ('Gutachten', '2004-06-18 00:00:00.000', 121, 'FE11', 2004), 
    ('Gutachten', '2004-02-25 00:00:00.000', 7, 'FE11', 2004), 
    ('Gutachten', '2004-03-05 00:00:00.000', 10, 'FE12', 2004), 
    ('Gutachten', '2004-02-25 00:00:00.000', 0, 'FE11', 2004), 
    ('Gutachten', '2004-03-19 00:00:00.000', 8, 'FE12', 2004) 
; 

我想最终是这样一个表:

OrgEinheit GAErteilungsJahr TotalNumber NumberFaster22d Percentage 
FE11  2003    10   3    0.3 
FE11  2004    20   6    0.3 
FE12  ... 

所以我需要的是让:

  1. 每年申请'OrgEinheit'的总数量

  2. 与交货期比22天

  3. 1.计算的百分比)+ 2)

对于1)更快的请求数我设法与

SELECT OrgEinheit, 
COUNT(*) AS Anzahl, GAErteilungsJahr 
FROM GAontime 
GROUP BY OrgEinheit, GAErteilungsJahr 
结果

对于2)我有:

SELECT OrgEinheit, Count(*) As Total 
FROM GAontime 
WHERE (GALaufzeit < 22) 
GROUP BY OrgEinheit, GAErteilungsJahr 

对于我搞砸了与语法问题,其余的是因为我想在单个SQL查询中执行此操作。

我的计划下面的步骤是:

  • JOIN表从1)与2)
  • 执行百分比
  • 获得的结果表数据库视图的计算(如描述在'我想要的')

我该如何编写这个大的SQL查询?任何帮助表示赞赏。

+0

(2)是每'OrgEinheit'但*不*每'GAErteilungsJahr'。因此可能(2)中的数字大于(1)中的数字。用这些术语计算百分比值没有多大意义。 –

+0

是的,你是对的 - 我的错误。我更正了(2) – Bebass

回答

1

测试此您可以通过应用案例结合起来,同一个查询中的“过滤器”。当投影计数积极的比赛。然后,可以应用该比率计算,而不通过使用派生表或CTE重复计算:

SELECT OrgEinheit, GAErteilungsJahr, TotalNumber, NumberFaster22d, 
    CAST(NumberFaster22d AS DECIMAL(10,2))/TotalNumber AS Percentage 
FROM 
(
    SELECT OrgEinheit, GAErteilungsJahr, COUNT(*) AS TotalNumber, 
      SUM(Case WHEN GALaufzeit < 22 THEN 1 ELSE 0 END) AS NumberFaster22d 
    FROM GAontime 
    GROUP BY OrgEinheit,GAErteilungsJahr 
) x 
ORDER BY OrgEinheit,GAErteilungsJahr; 
+0

这也很好,谢谢。我认为与JamesZ相比的区别在于你使用COUNT而不是'SUM(1)'。感谢您提及'CTE'。我从来没有听说过这个话题。 – Bebass

+0

请注意,返回为'x'的伪表称为“派生表” - 不是子查询,因为它返回多个列。 CTE类似,虽然放置在查询的开始处,即“WITH x as(...)SELECT ... FROM x” – StuartLC

3

您正在寻找类似的东西吗?您的数据和例子并没有真正匹配,但是这是从你的企图制造:

select 
    *, 
    cast(NumberFaster22d as float)/TotalNumber as Percentage 
from 
(
    select 
    OrgEinheit, 
    GAErteilungsJahr, 
    sum(1) as TotalNumber, 
    sum(case when GALaufzeit < 22 then 1 else 0 end) as NumberFaster22d 
    from 
    GAontime 
    group by 
    OrgEinheit, 
    GAErteilungsJahr 
) X 
order by 
    OrgEinheit, 
    GAErteilungsJahr 

的情况下,使用与价值< 22和派生表来计算的比值来计算只有行。

可以在SQL Fiddle

+0

你的建议效果很好,谢谢!我认为线索是和'case'一起使用'sum'。我还了解到子查询需要一个像'X'这样的名字。我在之前的尝试中并未尊重这一点。'X'是否等同于'AS X'? – Bebass