2011-01-19 19 views
6

Kullanıcıların MS excel ön ucunu ona bağlayabilmeleri ve ham verileri bir kaynak olarak kullanabilmeleri için depolanmış proc aracılığıyla seçmek istediğim bir veri tablosu var grafiğe, sol dış birleştirmeye sıralı tarihler için sql temp tablosu oluşturur

Tablodaki ham verilerle ilgili sorun, tarihler arasında boşluklar var, çünkü belirli bir gün için veri yoksa (o tarihle ilgili kayıt yok), kullanıcılar grafik oluşturmaya çalıştığında sorun çıkarır.

Kayıtlı proc'm sol dış birleştirme tarihini tempolu bir tabloya güncellemek istiyorum, böylece sağ taraf, basit bir çizim deneyimini elde etmek için sıfıra atabileceğim boş değerlere dönüşecek.

En iyi bir başlangıç ​​ve bitiş tarihi arasındaki bir tarihler tablosunu nasıl oluştururum? SQL Server 2005'te

+0

Bir dizi üreteci arıyoruz; [Bu] (http://msdn.microsoft.com/en-us/library/aa175802 (v = sql.80) .aspx), son ihtiyacım olanı temel almam için kullandığım makaleydi. Tabii ki, sadece bir kez yapmak istiyorsanız, bir imleç ya da basit bir döngü sadece iyi yapardı ... –

cevap

12

ve yukarı, bunu yapmak için böyle bir şey (bir ortak tablo ifade CTE) kullanabilirsiniz:

DECLARE @DateFrom DATETIME 
SET @DateFrom = '2011-01-01' 

DECLARE @DateTo DATETIME 
SET @DateTo = '2011-01-10' 

;WITH DateRanges AS 
(
    SELECT @DateFrom AS 'DateValue' 
    UNION ALL 
    SELECT DATEADD(DAY, 1, DateValue) 
    FROM DateRanges 
    WHERE DateValue < @DateTo 
) 
SELECT * FROM DateRanges 

Sen LEFT OUTER JOIN bu tabloya karşı CTE ve sonucu geri dönebilirler.

+0

Son olarak! Bunun için teşekkür ederim. Bu çok basit olması gerektiği gibi görünüyordu ama yine de benzer sorulara verilen diğer cevaplar, fonksiyonlar veya kalıcı tablolar yaratmayı içeriyordu. Bu tam olarak ihtiyacım olan çözüm ve mükemmel çalışıyor. –

+0

Bu daha kolay bir yoldur, ancak binlerce veya milyonlarca tarihe büyürse, geçici veya kalıcı bir tabloya kıyasla kötü bir performansa sahiptir. Bunu kontrol edin: http://www.sqlservercentral.com/articles/T-SQL/74118/ –

4

bir yolu CTE ile olacaktır:

with cte_dates as (
    select cast('20110119' as datetime) as [date] 
    union all 
    select dateadd(dd, 1, [date]) 
     from cte_dates 
     where dateadd(dd, 1, [date]) <= '20111231' 
) 
select [date], YourColumn 
    from cte_dates 
     left join YourTable 
      on ... 
option (maxrecursion 0); 
+0

+1, gönderiniz kabul edilen cevabın tam dakikasında gönderildi ve WHERE maddesinin kendisinden daha sağlam olması nedeniyle (kabul edilen cevapta gözden kaçan 1'den büyük aralıklarla çalışır). – kmote

4

bir başka yolu da bir bellek tablosuyla yapmanın. Yukarıdaki çözümlerin bazıları gibi yineleme sınırlamaları nedeniyle boğulmayacaktır.

DECLARE @dates AS TABLE ([Date] date); 

DECLARE @date date = {d '2010-10-01'}; 
DECLARE @endDate date = {d '2010-11-01'}; 

while (@date < @endDate) 
BEGIN 
    INSERT INTO @dates VALUES (@date); 
    SET @date = dateadd(DAY, 1, @date) 
END 
SELECT * FROM @dates; 

SQL Fiddle

+0

"Maksimum yineleme bitmiştir." – Diego

İlgili konular