Не удается сгруппировать по внутреннему псевдониму?

у меня есть таблица с именем information_livraison

Num_bloc    date_livraison
14104       2012-03-22 09:18:43.000
14202       2012-03-22 09:18:43.000
13276       2012-03-22 09:19:39.000
12775       2012-03-22 09:24:59.000
12967       2012-03-22 09:29:18.000
13809       2012-03-22 09:50:14.000
14611       2012-03-22 10:04:56.000
10320       2012-03-22 10:05:33.000
14593       2012-03-22 10:06:20.000
15179       2012-03-22 10:06:43.000

я должен построить запрос, который выбирает диапазон дат и возвращает количество каждой доступной даты в нем.

мой запрос:

Declare @Days Table (DateField datetime)

Declare @CurrentDate datetime
Declare @EndDate datetime

Set @CurrentDate = (SELECT DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0))
Set @EndDate = (SELECT DATEADD(ms,- 3,DATEADD(mm,0,DATEADD(mm,DATEDIFF(mm,0,GETDATE())+1,0))))


While @CurrentDate <= @EndDate
  Begin
     Insert Into @Days Values(@CurrentDate)
     Set @CurrentDate = DateAdd(d,1,@CurrentDate)
  End 


Select convert(varchar(10),DateField,103) as DT ,IsNull(Livre,0) AS Livre

From @Days

     LEFT OUTER JOIN 
      (SELECT DATEADD(day, DATEDIFF(day, '20040101', [date_livraison]), '20040101') , Count(*) AS Livre
        FROM Colis.dbo.information_livraison 
        GROUP BY DATEADD(day, DATEDIFF(day, '20040101', [date_livraison]), '20040101')) LV 
      ON DateField = DATEADD(day, DATEDIFF(day, '20040101', [date_livraison]), '20040101')


 ORDER BY DateField ASC

 GO 

возникла ошибка

Сообщение 8155, уровень 16, состояние 2, строка 17
Укажите столбец, указанный для столбца 1 "LV".
Сообщение 207, уровень 16, состояние 1, строка 25
Недействительное имя столбца: ' date_livraison'.

я хочу этот результат

DT          Livre   
01/03/2012  0
02/03/2012  0
03/03/2012  0
04/03/2012  0
05/03/2012  0
......
21/03/2012  10
22/03/2012  0
......
29/03/2012  0
30/03/2012  0
31/03/2012  0

person AymenRM    schedule 22.03.2012    source источник
comment
нет @bluefeet ! порядок для Select convert(varchar(10),DateField,103) as DT ,IsNull(Livre,0) AS Livre .   -  person AymenRM    schedule 22.03.2012


Ответы (4)


Попробуйте явно указать производному столбцу псевдоним в подзапросе:

Select DT ,IsNull(Livre,0) AS Livre
From @Days
LEFT OUTER JOIN 
(SELECT DATEADD(day, DATEDIFF(day, '20040101', [date_livraison]), '20040101') as DT, 
        Count(*) AS Livre
 FROM Colis.dbo.information_livraison 
 GROUP BY DATEADD(day, DATEDIFF(day, '20040101', [date_livraison]), '20040101')) LV 
ON DateField = DT
ORDER BY DateField ASC
person Community    schedule 22.03.2012

Я думаю, вы хотите это для своего выбора:

Select convert(varchar(10),DateField,103) as DT ,IsNull(Livre,0) AS Livre
From @Days
 LEFT OUTER JOIN 
  (SELECT DATEADD(day, DATEDIFF(day, '20040101', [date_livraison]), '20040101') DT ,     Count(*) AS Livre
    FROM @information_livraison
    GROUP BY DATEADD(day, DATEDIFF(day, '20040101', [date_livraison]), '20040101')) LV 
  ON DateField = DT
 ORDER BY DateField ASC

Я добавил имя столбца для DATEADD, а затем использовал его для join, похоже, это дает результаты, которые вам нужны.

person Jay Otterbein    schedule 22.03.2012

В подзапросе вам нужно добавить псевдоним к первому столбцу. Затем в предложении ON, которое присоединяется к подзапросу, используйте псевдоним. Здесь я использовал xxx, чтобы сделать его очевидным (и для ясности добавил псевдоним «dd» к таблице @Days)

Select
   convert(varchar(10), dd.DateField,103) as DT
  ,IsNull(LV.Livre,0) AS Livre
 From @Days dd
  LEFT OUTER JOIN (SELECT
                      DATEADD(day, DATEDIFF(day, '20040101', [date_livraison]), '20040101') xxx
                     ,Count(*) AS Livre
                    FROM Colis.dbo.information_livraison        
                    GROUP BY DATEADD(day, DATEDIFF(day, '20040101', [date_livraison]), '20040101')) LV  
   ON dd.DateField = LV.xxx
 ORDER BY dd.DateField ASC 
person Philip Kelley    schedule 22.03.2012

Вам необходимо указать псевдоним для поля даты в подзапросе:

Select convert(varchar(10),DateField,103) as DT ,IsNull(Livre,0) AS Livre
From @Days
LEFT OUTER JOIN 
(
    SELECT DATEADD(day, DATEDIFF(day, '20040101', [date_livraison]), '20040101') as LDate, Count(*) AS Livre
    FROM Colis.dbo.information_livraison 
    GROUP BY DATEADD(day, DATEDIFF(day, '20040101', [date_livraison]), '20040101')
) LV 
    ON DateField = LV.LDate
ORDER BY DateField ASC

Если вы сделаете это, то, когда вы присоединитесь к полям, это будет выглядеть так:

ON DateField = LV.LDate
person Taryn    schedule 22.03.2012