2012-11-16 102 views
2

我在嘗試構建一個select語句,該語句會爲每個月和用戶提供一個百分比值。在一個查詢中針對一個表的多個選擇

我有一張桌子,看起來像這樣的行; 表名:pytrans

tTransDate tArtCode tTime tSignature 
20120801 DKK  1  30JK 
20120801 AD  1.5 30JK 
20120802 DKB  3  40AK 
20120903 MI  2  45TR 
20120904 DKK  2  30JK 
20120904 DKB  2  30JK 

的選擇(S)應該給我多少時間tArtCode DKB或DKK花費的花費在所有tArtCode所有的時間每個簽名和每月的百分比。所以從上面的例子中選擇應該給我40%的簽名30JK在第8個月和100%簽名30JK在第9個月。

我已經嘗試了不同種類的sql select語句,但它似乎並沒有得到100 % 對。 這就是我所得到的;

select DATEPART(YY, tTransdatum) AS Year, DATEPART(mm, tTransdatum) AS Month, tSignatur, 
    (select SUM(tAntal) AS SumPart from pytrans where tSignatur = '30JK' AND (tArtikelkod = 'DKK' OR tArtikelkod = 'DKB')) 
    /(select DATEPART(YY, tTransdatum) AS Year, DATEPART(mm, tTransdatum) AS Month, SUM(tAntal) AS SumTot from pytrans where tSignatur = '30JK' GROUP BY Year, Month, SumTot) * 100 
From pytrans where tSignatur = '30JK' GROUP BY DATEPART(mm, tTransdatum), DATEPART(YY, tTransdatum), tSignatur 

此SQL不起作用的錯誤是,我不能組Year,Month,SumTot。我也得到錯誤;當子查詢未與EXISTS一起引入時,只能在選擇列表中指定一個表達式。

這下一個SQL選擇給我我想要什麼,但我要具體什麼我要求......可以這麼說。如果我使用這個SQL,那麼我需要爲每個簽名和每個月都有一個SQL查詢,這並不是真正的創意。

select TOP 1 DATEPART(YY, tTransdatum) AS Year, DATEPART(mm, tTransdatum) AS Month, tSignatur, 
SumProc = (select SUM(tAntal) from pytrans 
      where tSignatur = '30JK' AND (tArtikelkod NOT LIKE 'FL' AND tArtikelkod NOT LIKE 'SEM' AND tArtikelkod NOT LIKE 'KOMPIN') AND (tArtikelkod = 'DKK' OR tArtikelkod = 'DKB') AND tTransdatum BETWEEN '20121101' AND '20121131') 
     /(select SUM(tAntal) from pytrans 
      where tSignatur = '30JK' AND (tArtikelkod NOT LIKE 'FL' AND tArtikelkod NOT LIKE 'SEM' AND tArtikelkod NOT LIKE 'KOMPIN') AND tTransdatum BETWEEN '20121101' AND '20121131') * 100 
from pytrans 
Where tSignatur = '30JK' AND tTransdatum BETWEEN '20121101' AND '20121131' 
group by tTransdatum, tSignatur 

我也試過聯盟,但似乎並沒有爲我工作。

我真的需要幫助!謝謝!

+0

請給我們看看_exactly_預期的輸出是什麼,給出當前的示例數據?另外,怎麼了用't''加上前綴?除非絕對必要,否則不要縮寫事物,並且應該很好理解 - 「trans」代表「交易」,「轉移」還是其他?不要使用它們的類型來標記列,從名稱中明顯地指定類型 - 即使用'occurrenceOn'而不是'tTransDate'。不要使用'BETWEEN',總是使用獨佔的上限(''<''),_especially_帶有日期/時間/時間戳。如果你給我們的例子,至少要確保所有的名字匹配... –

+0

我不是這個數據庫的創建者,我不知道它爲什麼以「t」爲前綴。 Trans代表這個數據庫中的交易,或者更準確地說是「時間交易」。列名也是我想知道的事情,但我無法改變。 我很好奇爲什麼不使用BETWEEN不是像<?那樣精確。我在即將到來的各種場景中使用BETWEEN。 – Slint

+0

在_most_ RDBMSs中,'BETWEEN'實際上是一個包含上限(''<='')。這使得處理範圍變得尷尬,並且促進了逐個錯誤,特別是考慮日期/時間/時間戳類型,在SQL Server上更是如此。本網站上的其他響應者之一Aaron Bertrand擁有很好的[博客條目](http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-魔鬼在共同.aspx)在那裏的危險。但實際上,它通常是概念化數據實際上意味着的結果... –

回答

1
Create Table #pytrans(tTransdatum datetime, tArtCode varchar(10), tAntal float, tSignature varchar(10)) 

insert into #pytrans Values('20120801', 'DKK',  1  ,'30JK') 
insert into #pytrans Values('20120801', 'AD',  1.5 ,'30JK') 
insert into #pytrans Values('20120802', 'DKB',  3  ,'40AK') 
insert into #pytrans Values('20120903', 'MI',  2  ,'45TR') 
insert into #pytrans Values('20120904', 'DKK',  2  ,'30JK') 
insert into #pytrans Values('20120904', 'DKB',  2  ,'30JK') 

Select a.Year,a.Month,a.tSignature,a.SumPart as aAll,b.SumPart as bAll,Case when b.SumPart =0 then NULL else a.SumPart/b.SumPart * 100 end as [Percent] 
from 
(select DATEPART(YY, tTransdatum) AS Year, DATEPART(mm, tTransdatum) AS Month, tSignature 
,SUM(tAntal) AS SumPart 
from #pytrans 
where tSignature = '30JK' AND tArtCode in('DKK' ,'DKB') 
Group by DATEPART(YY, tTransdatum) , DATEPART(mm, tTransdatum) , tSignature) a 
Left Join 
(select DATEPART(YY, tTransdatum) AS Year, DATEPART(mm, tTransdatum) AS Month, tSignature 
,SUM(tAntal) AS SumPart 
from #pytrans 
where tSignature = '30JK' 
Group by DATEPART(YY, tTransdatum) , DATEPART(mm, tTransdatum) , tSignature) b 
on a.Month=b.Month and a.Year =b.Year and a.tSignature = b.tSignature 
+1

謝謝bummi它給了我正是我想找的東西,我會更新能夠把那個怪胎假設sql一起我的自我! – Slint

相關問題