Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Все дни мясяца с привязкой к таблице  [new]
MrBlackJack
Member

Откуда:
Сообщений: 43
Здравствуйте, уважаемый форумчане!

У меня есть таблица назовем ее tab1, где есть поля дата и коли-во
Дата Кол-во
01.01.20115
05.01.201115
и т.д.

Мне нужно вывести за выбранный месяц все дни, для наглядности, то есть нужно получить следующее:
Дата Кол-во
01.01.20115
02.01.20110
03.01.20110
04.01.20110
05.01.201115
и т.д.

Например, вот так формирую временную табличку на 31 дн (потом уже в программе буду скрывать поля в зависимости от месяца, но не суть...)

declare @dt datetime
set @dt = '2011-01-01 00:00:000'


declare @tab table (dt datetime, DayWeek int)
insert into @tab
select @dt + nmr as dt,
case when (DATEPART(dw,@dt + nmr) + @@DATEFIRST)%7 in(1,0)
then 1 else 0 end as DayWeek
from
(select 0 as nmr union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7
union select 8 union select 9 union select 10 union select 11 union select 12 union select 13 union select 14 union select 15
union select 16 union select 17 union select 18 union select 19 union select 20 union select 21 union select 22 union select 23
union select 24 union select 25 union select 26 union select 27 union select 28 union select 29 union select 30
) q

Затем я присоединяю ее с таблицой tab1, с привязкой по дате

 select 
--поля--
from  @tab t
left join tab1 on tab1.дата = t.dt

Я новичек и видимо много еще чего не понимаю) Не могу понять почему left в данном случаи работает как inner и отображает почему - то только связные по дате строки...Прошу вашей помощи, ибо сам уже уперся, никак не могу понять..

Заранее спасибо!
20 сен 11, 13:34    [11304968]     Ответить | Цитировать Сообщить модератору
 Re: Все дни мясяца с привязкой к таблице  [new]
date+int
Guest
i ono vot tak: @dt + nmr skladyvaet??
(sm. DateAdd)
20 сен 11, 13:43    [11305062]     Ответить | Цитировать Сообщить модератору
 Re: Все дни мясяца с привязкой к таблице  [new]
Владимир СА
Member

Откуда:
Сообщений: 7915
MrBlackJack
Что-то в этом роде:
DECLARE @min_dat date, @max_dat date;
SET @min_dat = '20110101';
SET @max_dat = '20111231';
DECLARE @tab1 table (dat date, kolvo int);
INSERT INTO @tab1 (dat,kolvo) VALUES
('20110102', 5),
('20110105', 15),
('20110203', 3),
('20110212', 12);

SELECT * FROM @tab1;

WITH dateCTE (dat)
AS
(
  select @min_dat
  union all
  select DATEADD(day,1,dat) from DateCTE
  where dat < @max_dat
)
SELECT d.dat, CASE WHEN t.kolvo is null THEN 0 ELSE t.kolvo END as kolvo
FROM dateCTE d
LEFT JOIN @tab1 t
ON d.dat = t.dat
OPTION (MAXRECURSION 366);
20 сен 11, 14:52    [11305895]     Ответить | Цитировать Сообщить модератору
 Re: Все дни мясяца с привязкой к таблице  [new]
MrBlackJack
Member

Откуда:
Сообщений: 43
Владимир СА, спасибо!

Сразу хочу здесь же еще кое-что спросить, дабы не начинать новую тему. А если у меня таблица имеет вид, например:

declare @temp table (id int,nm varchar(max), dt datetime, Qt int)

insert into @temp 
select 1,'Хлеб','2011-01-02 00:00:00.000', 50 union
select 1,'Хлеб','2011-01-08 00:00:00.000', 47 union
select 1,'Хлеб','2011-01-11 00:00:00.000', 43 union
select 1,'Хлеб','2011-01-18 00:00:00.000', 12 union
select 2,'Молоко','2011-01-14 00:00:00.000', 20 union
select 2,'Молоко','2011-01-15 00:00:00.000', 15 union
select 2,'Молоко','2011-01-21 00:00:00.000', 10 union
select 2,'Молоко','2011-01-18 00:00:00.000', 5 union
select 3,'Мороженное','2011-01-18 00:00:00.000', 20 

select * from @temp
а мне нужно для каждой такой позиции вывести все дни, как было описано выше, то есть

id dt Qt
1 2011-01-01 00:00:00.000 0
1 2011-01-02 00:00:00.000 50
..........................................
1 2011-01-31 00:00:00.0000
2 2011-01-01 00:00:00.000 0
..........................................
2 2011-01-14 00:00:00.000 20
..........................................
2 2011-01-31 00:00:00.000 0
и т.д.
20 сен 11, 16:30    [11307055]     Ответить | Цитировать Сообщить модератору
 Re: Все дни мясяца с привязкой к таблице  [new]
Владимир СА
Member

Откуда:
Сообщений: 7915
declare @temp table (id int,nm varchar(max), dt datetime, Qt int)

insert into @temp (id,nm,dt,Qt)
select 1,'Хлеб','20110102 00:00:00.000', 50 union all
select 1,'Хлеб','20110108 00:00:00.000', 47 union all
select 1,'Хлеб','20110111 00:00:00.000', 43 union all
select 1,'Хлеб','20110118 00:00:00.000', 12 union all
select 2,'Молоко','20110114 00:00:00.000', 20 union all
select 2,'Молоко','20110115 00:00:00.000', 15 union all
select 2,'Молоко','20110121 00:00:00.000', 10 union all
select 2,'Молоко','20110118 00:00:00.000', 5 union all
select 3,'Мороженное','20110118 00:00:00.000', 20 

select * from @temp

DECLARE @min_dat datetime, @max_dat datetime;
SET @min_dat = '20110101';
SET @max_dat = '20110131';

WITH dateCTE (dat)
AS
(
  select @min_dat
  union all
  select DATEADD(day,1,dat) from DateCTE
  where dat < @max_dat
)
SELECT t.id,d.dat as dt, CASE WHEN t.Qt is null THEN 0 ELSE t.Qt END as Qt
FROM dateCTE d
LEFT JOIN @temp t
ON d.dat = t.dt;
Только id тут и нафиг ненужен... Его то как определить?
Может тебе для каждого id надо такой результат? Т.к. непонятно, какое значение id подставлять...
21 сен 11, 07:34    [11309343]     Ответить | Цитировать Сообщить модератору
 Re: Все дни мясяца с привязкой к таблице  [new]
date+int
Guest
declare @temp table (id int,nm nvarchar(max), dt datetime, Qt int)

insert into @temp (id, nm,dt,Qt)
select 1,N'Хлеб' ,'20110102 00:00:00.000', 50 union all
select 1,N'Хлеб','20110108 00:00:00.000', 47 union all
select 1,N'Хлеб','20110111 00:00:00.000', 43 union all
select 1,N'Хлеб','20110118 00:00:00.000', 12 union all
select 2,N'Молоко','20110114 00:00:00.000', 20 union all
select 2,N'Молоко','20110115 00:00:00.000', 15 union all
select 2,N'Молоко','20110121 00:00:00.000', 10 union all
select 2,N'Молоко','20110118 00:00:00.000', 5 union all
select 3,N'Мороженое','20110118 00:00:00.000', 20 

select * from @temp

DECLARE @min_dat datetime, @max_dat datetime;
SET @min_dat = '20110101';
SET @max_dat = '20110131';

WITH dateCTE (dat)
AS
(
  select @min_dat
  union all
  select DATEADD(day,1,dat) from DateCTE
  where dat < @max_dat
)
SELECT id.id,d.dat as dt, CASE WHEN t.Qt is null THEN 0 ELSE t.Qt END as Qt
FROM dateCTE d cross join (select distinct ID from @temp)id
LEFT JOIN @temp t
ON d.dat = t.dt
order by 1,2;

p.s. Мороженое
21 сен 11, 21:13    [11315628]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить