我在嘗試構建一個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
我也試過聯盟,但似乎並沒有爲我工作。
我真的需要幫助!謝謝!
請給我們看看_exactly_預期的輸出是什麼,給出當前的示例數據?另外,怎麼了用't''加上前綴?除非絕對必要,否則不要縮寫事物,並且應該很好理解 - 「trans」代表「交易」,「轉移」還是其他?不要使用它們的類型來標記列,從名稱中明顯地指定類型 - 即使用'occurrenceOn'而不是'tTransDate'。不要使用'BETWEEN',總是使用獨佔的上限(''<''),_especially_帶有日期/時間/時間戳。如果你給我們的例子,至少要確保所有的名字匹配... –
我不是這個數據庫的創建者,我不知道它爲什麼以「t」爲前綴。 Trans代表這個數據庫中的交易,或者更準確地說是「時間交易」。列名也是我想知道的事情,但我無法改變。 我很好奇爲什麼不使用BETWEEN不是像<?那樣精確。我在即將到來的各種場景中使用BETWEEN。 – Slint
在_most_ RDBMSs中,'BETWEEN'實際上是一個包含上限(''<='')。這使得處理範圍變得尷尬,並且促進了逐個錯誤,特別是考慮日期/時間/時間戳類型,在SQL Server上更是如此。本網站上的其他響應者之一Aaron Bertrand擁有很好的[博客條目](http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-魔鬼在共同.aspx)在那裏的危險。但實際上,它通常是概念化數據實際上意味着的結果... –