2015-07-05 34 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