2015-10-12 86 views
0

我想聚合查詢來計算兩個日期之間的記錄,我希望在別名列名稱的結果作爲startDay - 結束日即假設我想要記錄數在2015年1月1日和2015年1月5日之間,那麼我希望結果在列頭像「1 - 5」一樣。如何將變量名稱分配給SQL查詢別名列名?

+2

歡迎使用計算器。爲了得到更好的答案,考慮添加一些你想要實現的例子,以及你試過的問題。 –

+1

你正在使用哪些DBMS? Postgres的?甲骨文? –

回答

-1

好的,這裏沒有說明這裏是我最好的嘗試,試圖找出你在找什麼。如果我完全離開,我表示歉意。

基本上,如果您正在查找自定義列名稱並且還希望有多個列的日期範圍。例如:如果您希望一列在1月1日到1月6日之間有值,那麼在1月7日到1月13日之間有另一列的日期...等等。然後你需要看看類似於我列在下面的子查詢。

您可以編寫子查詢來僅選擇要查找的範圍數據,然後將其重新添加到要從中提取的主表中。

注意:如果你使用這種方法,你會得到很多空值在你的查詢中彈出,所以你可能需要將它們過濾掉,因爲你認爲合適,但是這種變化很大,你怎麼做聯接到子查詢。

SELECT 
ID 
X.Jan1toJan6 AS [custom column name] 
FROM 
TABLE1 
INNER JOIN 
(SELECT DISTINCT 
ID, 
[UpdateDate] as Jan1toJan6 
FROM [table1] 
WHERE [UpdateDate] BETWEEN '2008-01-01' AND '2008-01-06') as X 
ON X.ID = Table1.ID 
+0

謝謝,其實我需要的結果是這樣的: –

+0

每週第一天\t第一 - 最後一天周\t報名人數 05-OCT-15 \t 10月5日至一十日 12 - 15 \t 10月12日至17日\t 50 –

1

警告:我不認爲這是一個好主意。你應該使用一個通用的列名,它會爲你節省很多麻煩,特別是因爲用戶不太可能真正理解這樣的列名意味着什麼。如果用戶想要輕鬆查看報告的運行日期,最好將開始日期和結束日期作爲單獨的列返回。然而,這是一個不完美的世界,有時我們會遇到迫使我們進入不完美解決方案的要求。 (但是,推回這一個,至少儘量不要這樣做,因爲這是一個可怕的想法。)

在這種情況下我得到的想法,你想根據發送的日期作爲查詢的參數,如果日期是從1日到5日,如果日期是20日到25日,則需要1到5日,則需要20-25作爲列名。要做到這一點,你需要動態SQl,這是一個寫作的痛苦,甚至更糟糕的測試。它也可能是一個安全噩夢。如果你一定和決心做這種愚蠢的事情,那麼這就是它會大概怎麼做:

declare @startdate date= '2015/01/01' 
, @enddate date='2015/01/05' 
, @test varchar (10) 
set @test = cast(day(@startdate) as varchar (2)) +'-' + cast(day(@enddate) as varchar (2)) 


declare @Sql varchar(max) 
set @sql = 'select top 10 id, field1 - field2 as ' 
+''''[email protected]+'''' + ' from table1 
where date_entered >' +cast(@startdate as varchar(10))+ 
' and date_entered <= ' + cast(@enddate as varchar(10)) 

EXECUTE sp_executesql @SQL 

其實你應該設置參數值的執行sp_executesql的語句,但我騙了,因爲你只路過在日期中很難用於SQL注入攻擊。在任何情況下,不考慮這樣做,直到您已閱讀並完全理解以下鏈接:

http://www.sommarskog.se/dynamic_sql.html

動態SQL可能是非常危險的,應該避免尤其是當它是唯一的化妝品是正在要求使用它。不應該輕易使用它,也不要理解你正在做的事情的全部含義。