2016-02-04 6 views
1

У меня есть таблица, содержащая столбцы VisitorName, vitising_date, location Id. Мне нужно, чтобы отобразить записи для текущего местоположения месяца посетитель мудрых вместе с последним месяцем посетителемЗапрос SQL Server: преобразование строк в столбцы

SQL FIDDLE

Таблица схема:

CREATE TABLE visitors 
(
    [id] [bigint] IDENTITY(1,1) NOT NULL, 
    [name] varchar(50), 
    [location_id] [bigint], 
    [visited_date] [datetime] 
); 

name location_id visited_date 
David  1   2016-01-04 
John  1   2016-01-02 
Andrea  1   2016-01-05 
Ely  2   2016-01-04 
Andrea  1   2016-02-02 
John  1   2016-02-02 
Peter  2   2016-02-02 

Запроса на текущий месяц запись:

select * 
from visitors 
where 
    DATEPART(month, visited_date) = DATEPART(MONTH, GETDATE()) 
    and DATEPART(year, visited_date) = DATEPART(year, getdate()) 

Но мне нужны данные для отображения последнего м аяся ца запись по текущему месяцу что-то вроде этого

Locationid Name  Date  LastMonthVisitor LastMonthVisitingDate 
    1   Andrea 2016-02-02 Andrea    2016-01-05 
    1    John 2016-02-02 David    2016-01-04 
    1   'NA' 'NA'  John    2016-01-02 

    2   Peter 2016-02-02 Ely     2016-01-04 

  1. Записи показывает список посетителей текущего месяца группы по ID местоположения (идентификатор местоположения является внешним ключом)
  2. Теперь мне нужен список в прошлом месяце группа посетителей по ID местоположения

Эти результаты являются рядом друг с другом по дате. Возможно, они могут измениться, если в прошлом месяце запись посетителя была равна 5 для location_id 1, а текущий посетитель месяца был бы 2 Итак, наконец, он отобразит 5 записей. Они не связаны между именем посетителя текущего месяца, именем посетителя LastMonth.

Я могу сделать часть на стороне сервера C# и отобразить список CurrentMonthVisitors в группе LastMonthVisitor по идентификатору местоположения. Но я пытаюсь в SQL.

+0

Почему Давид не появляется в вашем примере результирующего набора? Какое отношение у Иоанна и Давида есть во втором альбоме, и что случилось с Эли? –

+0

@TimBiegeleisen: Дэвид тоже дер, но в колонке посетителя в прошлом месяце. Запись находится в текущем месяце. –

+0

Почему бы вам не сделать два выбора и объединить? http://stackoverflow.com/questions/27238170/how-to-combine-two-querys-results-into-one-row –

ответ

1

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

;WITH CTE as 
(
    SELECT 
    *, 
    -- setting a row number based on month, and location 
    row_number() over 
    (partition by datediff(month, 0, visited_date), 
    location_id order by visited_date, name) rn, 
    datediff(month, 0, visited_date) month 
    FROM visitors 
    WHERE 
    -- current and last month 
    visited_date >= dateadd(month, datediff(month, 0, getdate()) - 1, 0) and 
    visited_date < dateadd(month, datediff(month, -1, getdate()), 0) 
) 
SELECT 
    CTE.location_id Locationid, 
    COALESCE(CTE.Name, 'N/A') Name, 
    CAST(CTE.visited_date as Date) Date, 
    COALESCE(CTE2.name, 'N/A') LastMonthVisitor, 
    CAST(CTE2.visited_date as Date) LastMonthVisitingDate 
FROM CTE 
-- full join to get data when there is not matching data for the other month 
FULL JOIN 
CTE CTE2 
ON CTE.rn = CTE2.rn 
and CTE.location_id = CTE2.location_id 
and CTE.month = CTE2.month-1 
WHERE 
    -- making sure CTE is last month or CTE2 is current month 
    cte.month =datediff(month, 0, getdate()) - 1 or 
    cte2.month=datediff(month, 0, getdate()) 
+0

Большое вам спасибо, что запрос действительно работает, я просто немного изменился .ie set CTE2 как текущий месяц здесь sql скрипт http: //sqlfiddle.com/#!3/9f050/9. Если вы не возражаете, можете ли вы добавить небольшое объяснение в свой ответ, чтобы он помог мне понять это лучше или нет ссылки refference, спасибо снова –

Смежные вопросы