table of numbers ve CROSS APPLY
kullanırdım.
Sayı tablosu, 1'den tam sayıya kadar bir sayıya, 100.000'e kadar bir tamsayı sayıları olan bir sütuna sahip bir tablodur. Şahsen 100K numaraları ile tabloyu kullanıyorum. Aaron Bertrand, bu tabloyu nasıl oluşturacağınızı açıklayan bir good article yazdı.
Örnek veri
DECLARE @T TABLE ([Property] varchar(50), [Item] varchar(50), [Month] datetime, [Repeat_Count] int, [Amount] int);
INSERT INTO @T ([Property], [Item], [Month], [Repeat_Count], [Amount]) VALUES
('A', 'Rent', '2016-01-01 00:00:00', 1, 100),
('A', 'Rent', '2016-02-01 00:00:00', 1, 105),
('A', 'Rent', '2016-03-01 00:00:00', 3, 110),
('A', 'Rent', '2016-06-01 00:00:00', 1, 115),
('A', 'Rent', '2016-07-01 00:00:00', 6, 120),
('A', 'Rent', '2017-01-01 00:00:00', 1, 125);
Sorgu
SELECT *
FROM
@T AS T
CROSS APPLY
(
SELECT
DATEADD(day, dbo.Numbers.Number-1, T.Month) AS NewDate
FROM dbo.Numbers
WHERE dbo.Numbers.Number <= T.Repeat_Count
) AS CA
ORDER BY NewDate;
Sonucu
+----------+------+-------------------------+--------------+--------+-------------------------+
| Property | Item | Month | Repeat_Count | Amount | NewDate |
+----------+------+-------------------------+--------------+--------+-------------------------+
| A | Rent | 2016-01-01 00:00:00.000 | 1 | 100 | 2016-01-01 00:00:00.000 |
| A | Rent | 2016-02-01 00:00:00.000 | 1 | 105 | 2016-02-01 00:00:00.000 |
| A | Rent | 2016-03-01 00:00:00.000 | 3 | 110 | 2016-03-01 00:00:00.000 |
| A | Rent | 2016-03-01 00:00:00.000 | 3 | 110 | 2016-03-02 00:00:00.000 |
| A | Rent | 2016-03-01 00:00:00.000 | 3 | 110 | 2016-03-03 00:00:00.000 |
| A | Rent | 2016-06-01 00:00:00.000 | 1 | 115 | 2016-06-01 00:00:00.000 |
| A | Rent | 2016-07-01 00:00:00.000 | 6 | 120 | 2016-07-01 00:00:00.000 |
| A | Rent | 2016-07-01 00:00:00.000 | 6 | 120 | 2016-07-02 00:00:00.000 |
| A | Rent | 2016-07-01 00:00:00.000 | 6 | 120 | 2016-07-03 00:00:00.000 |
| A | Rent | 2016-07-01 00:00:00.000 | 6 | 120 | 2016-07-04 00:00:00.000 |
| A | Rent | 2016-07-01 00:00:00.000 | 6 | 120 | 2016-07-05 00:00:00.000 |
| A | Rent | 2016-07-01 00:00:00.000 | 6 | 120 | 2016-07-06 00:00:00.000 |
| A | Rent | 2017-01-01 00:00:00.000 | 1 | 125 | 2017-01-01 00:00:00.000 |
+----------+------+-------------------------+--------------+--------+-------------------------+
Lütfen sorunuzu kullandığınız veritabanı ile etiketleyin. En iyi yol veritabanına bağlıdır. –
Merhaba ve taşma yığınına hoş geldiniz. Burada ilk önce kendinize gitmenizi bekliyoruz ... en azından işe yarayacak fikirleri araştırmak için ... sonra ne denediğinizi bize gösterin. –
Sanırım bu benim sorunum - SQL deneyimim var, fakat basit sorgulamalar ve katılımlar ile - hiç böyle bir şeye rastlamamıştım, bu yüzden verileri tamamen farklı bir şekilde göstermem gerekiyor. Araştırmaya çalışmam gereken belirli bir komut var mı? –