Не удается сгруппировать по внутреннему псевдониму? - PullRequest
1 голос
/ 22 марта 2012

У меня есть таблица с именем 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
Aucune colonne spécifiée pour la colonne 1 de 'LV '.
Msg 207, Уровень 16, Состояние 1, Строка 25
Nom de colonne non valide:' 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

Ответы [ 4 ]

1 голос
/ 22 марта 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 
1 голос
/ 22 марта 2012

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

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
1 голос
/ 22 марта 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, это, кажется, дает результаты, которые вы после.

0 голосов
/ 22 марта 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

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

...