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

Откуда:
Сообщений: 323
Добрый день.
Помогите разобраться с запросом.

есть сайт, по которой ведётся статистика. есть входы пользователей, и категории куда он заходил..так вот создала таблицу календарь вроде беды не предвещало...всё получилось связать..тут предложили создать категории руками чтобы вижно было кто куда должен заходить и не зашёл...так вот делаю объединение.. получился запрос

SELECT DISTINCT
dbo.Calendar.CalData, dbo.Security.UserName, dbo.Security.PageURL AS Expr1, DateStart
AS Date, dbo.Page.PageURL
FROM dbo.Calendar RIGHT OUTER JOIN
dbo.Session ON dbo.Session.DateStart = dbo.Calendar.CalData RIGHT OUTER JOIN
dbo.Request ON dbo.Session.SessionID = dbo.Request.SessionID RIGHT OUTER JOIN
dbo.Page ON dbo.Request.PageID = dbo.Page.PageID RIGHT OUTER JOIN
dbo.Security ON SUBSTRING(dbo.Session.UserID, 8, 12) = dbo.Security.UserName AND dbo.Page.PageURL = dbo.Security.PageKategory

но он не вывод всем календарь...очень нужна помощь..не знаю может нужно таблицы описать..я даже не знаю как всю проблему описать...мож примерно понятно из запроса...
7 ноя 13, 07:21    [15088657]     Ответить | Цитировать Сообщить модератору
 Re: объединение и календарь  [new]
da haroch
Member

Откуда:
Сообщений: 323
Вобщем мне нужно чтоб в первом столбце был полностью заполнен каледарь.
7 ноя 13, 07:22    [15088660]     Ответить | Цитировать Сообщить модератору
 Re: объединение и календарь  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
поменяйте RIGHT JOIN на LEFT JOIN
7 ноя 13, 07:23    [15088661]     Ответить | Цитировать Сообщить модератору
 Re: объединение и календарь  [new]
da haroch
Member

Откуда:
Сообщений: 323
да я меняла не получается
7 ноя 13, 07:25    [15088663]     Ответить | Цитировать Сообщить модератору
 Re: объединение и календарь  [new]
da haroch
Member

Откуда:
Сообщений: 323
т.е мне нужно чтоб было примерно так
1.01.2013 Пупкин Аудит готового автомобиля NULL NULL
1.01.2013 Пупкин Внешние претензии потребителей NULL NULL
1.01.2013 Пупкин Ежедневная справка о качестве NULL NULL
1.01.2013 Пупкин Ежемесячные приказы по качеству NULL NULL
1.01.2013 Морозов Аудит готового автомобиля NULL NULL
1.01.2013 Морозов Аудит деталей и узлов NULL NULL
1.01.2013 Морозов Внешние претензии потребителей NULL NULL
1.01.2013 Морозов Ежедневная справка о качестве NULL NULL
7 ноя 13, 07:31    [15088670]     Ответить | Цитировать Сообщить модератору
 Re: объединение и календарь  [new]
da haroch
Member

Откуда:
Сообщений: 323
а сейчас у меня там ноль.и а ставится каледарь только тем кто уже осуществил вход.
7 ноя 13, 07:38    [15088677]     Ответить | Цитировать Сообщить модератору
 Re: объединение и календарь  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
da haroch
да я меняла не получается

не верю
если вы напишите
SELECT DISTINCT 
dbo.Calendar.CalData, dbo.Security.UserName, dbo.Security.PageURL AS Expr1, DateStart
AS Date, dbo.Page.PageURL
FROM dbo.Calendar 
LEFT OUTER JOIN dbo.Session ON dbo.Session.DateStart = dbo.Calendar.CalData 
LEFT OUTER JOIN dbo.Request ON dbo.Session.SessionID = dbo.Request.SessionID 
LEFT OUTER JOIN dbo.Page ON dbo.Request.PageID = dbo.Page.PageID 
LEFT OUTER JOIN dbo.Security ON SUBSTRING(dbo.Session.UserID, 8, 12) = dbo.Security.UserName AND dbo.Page.PageURL = dbo.Security.PageKategory


то в результате по любому будут все записи из таблицы dbo.Calendar
7 ноя 13, 07:42    [15088680]     Ответить | Цитировать Сообщить модератору
 Re: объединение и календарь  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
da haroch,

1. Оставляем в запросе соединение двух таблиц.
2. Выполняем запрос.
3. Если результат запроса соответствует нашим ожиданиям, радуемся, добавляем следующее соединение и возвращаемся к пункту 2.
4. Если нет, то медитируем над запросом и его результатами, а также документацией, в части, что такое JOIN, LEFT JOIN и RIGHT JOIN

SELECT * /*dbo.Calendar.CalData, dbo.Security.UserName, dbo.Security.PageURL AS Expr1, DateStart
AS Date, dbo.Page.PageURL */
FROM dbo.Calendar RIGHT OUTER JOIN
dbo.Session ON dbo.Session.DateStart = dbo.Calendar.CalData  /*RIGHT OUTER JOIN
dbo.Request ON dbo.Session.SessionID = dbo.Request.SessionID RIGHT OUTER JOIN
dbo.Page ON dbo.Request.PageID = dbo.Page.PageID RIGHT OUTER JOIN
dbo.Security ON SUBSTRING(dbo.Session.UserID, 8, 12) = dbo.Security.UserName AND dbo.Page.PageURL = dbo.Security.PageKategory */
7 ноя 13, 07:48    [15088686]     Ответить | Цитировать Сообщить модератору
 Re: объединение и календарь  [new]
da haroch
Member

Откуда:
Сообщений: 323
Ruuu, ну да без вопроса он выводит все записи из таблицы каледарь...но проблема в том что когда делаю привязку..он категорям не ставит каледарь=((
7 ноя 13, 08:22    [15088731]     Ответить | Цитировать Сообщить модератору
 Re: объединение и календарь  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
Покажите запрос который выводит категорию но при этом календарь null.
7 ноя 13, 08:32    [15088754]     Ответить | Цитировать Сообщить модератору
 Re: объединение и календарь  [new]
Jaffar
Member

Откуда:
Сообщений: 633
da haroch,

если в категриию "K_1" 5 мая 2013 года никто не заходил д.б. строчка

5.05.2013 К_1 NULL, NULL ?
7 ноя 13, 08:35    [15088758]     Ответить | Цитировать Сообщить модератору
 Re: объединение и календарь  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
может Вам что-то такое надо
SELECT DISTINCT 
 c.CalData
,p.PageURL
,sc.UserName 
AS Date, dbo.Page.PageURL
FROM dbo.Calendar  c
CROSS JOIN dbo.Page p
LEFT OUTER JOIN dbo.Request  r ON r.PageID = p.PageID 
LEFT OUTER JOIN dbo.Session  s ON s.SessionID = r.SessionID  and s.DateStart = c.CalData 
LEFT OUTER JOIN dbo.Security  sc  ON SUBSTRING(s.UserID, 8, 12) = sc.UserName AND p.PageURL = sc.PageKategory
ORDER BY  1,2,3
7 ноя 13, 08:45    [15088777]     Ответить | Цитировать Сообщить модератору
 Re: объединение и календарь  [new]
da haroch
Member

Откуда:
Сообщений: 323
LexusR, да такое только вида c.CalData, sc.PageURL, sc.UserName, p.PageURL, s datestart
т.е каледарь должен соответствовать sc.PageURL а p.PageURL, s datestart должны заполняться уже есть человек зашёл к примеру 7 в остальных случая пусто ( p.PageURL, s datestart )
7 ноя 13, 09:59    [15089099]     Ответить | Цитировать Сообщить модератору
 Re: объединение и календарь  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
da haroch,

Для того чтобы люди поняли, чего вы хотите, оформите свой вопрос в соответствии с правилами:
https://www.sql.ru/forum/127456/rekomendacii-po-oformleniu-soobshheniy-v-forume
6. Если Ваш вопрос связан с созданием какого-то запроса, то предоставление Вами следующих материалов может существенно ускорить нахождение решения:
- скрипты создания таблиц;
- скрипты заполнения этих таблиц тестовыми данными;
- описание желаемого результата на примере тестовых данных.
(эти данные лучше офрмлять с использованием специальных тэгов, которые повысят их читабельность. Вот пример хорошего стиля )
Подумайте также над тем, чтобы описать решаемую Вами задачу целиком. Возможно, что тот способ решения, который Вы стремитесь воплотить в жизнь, не является наилучшим, а лишь кажется Вам таковым. Например, вместо вопроса "Как добавить несколько полей в системную таблицу sysusers?" лучше спросить "Как мне хранить дополнительную информацию, привязанную к пользователю бд? Можно ли для этого использовать системную таблицу sysusers?"
7 ноя 13, 10:14    [15089194]     Ответить | Цитировать Сообщить модератору
 Re: объединение и календарь  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
da haroch
LexusR, да такое только вида c.CalData, sc.PageURL, sc.UserName, p.PageURL, s datestart
т.е каледарь должен соответствовать sc.PageURL а p.PageURL, s datestart должны заполняться уже есть человек зашёл к примеру 7 в остальных случая пусто ( p.PageURL, s datestart )


по логике и седьмому чуству (..тут предложили создать категории руками чтобы вижно было кто куда должен заходить и не зашёл...) таблица dbo.Page не имеет отношение к сессии
И тогда в результате не имеет смысла второй раз выводить PageURL
нужно только добавить дату входа показывающую что юзер входил на страницу
SELECT DISTINCT 
 c.CalData
,p.PageURL
,sc.UserName 
,s.DateStart
FROM dbo.Calendar  c
CROSS JOIN dbo.Page p
LEFT OUTER JOIN dbo.Security  sc  ON  AND p.PageURL = sc.PageKategory
LEFT OUTER JOIN dbo.Request  r ON r.PageID = p.PageID 
LEFT OUTER JOIN dbo.Session  s ON s.SessionID = r.SessionID  and s.DateStart = c.CalData 
AND SUBSTRING(s.UserID, 8, 12) = sc.UserName
ORDER BY  1,2,3
7 ноя 13, 11:13    [15089515]     Ответить | Цитировать Сообщить модератору
 Re: объединение и календарь  [new]
da haroch
Member

Откуда:
Сообщений: 323
LexusR, да вы меня правильно поняли...только должен быть sc.PageKategory за место p.PageURL
7 ноя 13, 11:30    [15089622]     Ответить | Цитировать Сообщить модератору
 Re: объединение и календарь  [new]
da haroch
Member

Откуда:
Сообщений: 323
вот вроде переделала как должно быть, только даты входа не показывает=((
SELECT DISTINCT 
 c.CalData
,sc.UserName 
,sc.PageKategory
,s.DateStart
FROM dbo.Calendar  c
CROSS JOIN dbo.Security  sc 
LEFT OUTER JOIN  dbo.Page p ON  p.PageURL = sc.PageKategory
LEFT OUTER JOIN dbo.Request  r ON r.PageID = p.PageID 
LEFT OUTER JOIN dbo.Session  s ON s.SessionID = r.SessionID  and convert(char(10), s.DateStart, 104) = convert(char(10), c.CalData, 104) 
AND SUBSTRING(s.UserID, 8, 12) = sc.UserName
ORDER BY  1,2,3 
7 ноя 13, 11:53    [15089804]     Ответить | Цитировать Сообщить модератору
 Re: объединение и календарь  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2397
da haroch,

да приведите уже тестовые данные! со скриптами таблиц
а то гадание по кофейной гуще
7 ноя 13, 11:57    [15089842]     Ответить | Цитировать Сообщить модератору
 Re: объединение и календарь  [new]
da haroch
Member

Откуда:
Сообщений: 323
StarikNavy,

да это долго..я просто как представила мне сейчас этого описывать=))
7 ноя 13, 12:03    [15089904]     Ответить | Цитировать Сообщить модератору
 Re: объединение и календарь  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
da haroch
вот вроде переделала как должно быть, только даты входа не показывает=((
SELECT DISTINCT 
 c.CalData
,sc.UserName 
,sc.PageKategory
,s.DateStart
FROM dbo.Calendar  c
CROSS JOIN dbo.Security  sc 
LEFT OUTER JOIN  dbo.Page p ON  p.PageURL = sc.PageKategory
LEFT OUTER JOIN dbo.Request  r ON r.PageID = p.PageID 
LEFT OUTER JOIN dbo.Session  s ON s.SessionID = r.SessionID  and convert(char(10), s.DateStart, 104) = convert(char(10), c.CalData, 104) 
AND SUBSTRING(s.UserID, 8, 12) = sc.UserName
ORDER BY  1,2,3 


проверьте условие
AND SUBSTRING(s.UserID, 8, 12) = sc.UserName

правильно ли вырезается SUBSTRING(s.UserID, 8, 12)
7 ноя 13, 12:21    [15090074]     Ответить | Цитировать Сообщить модератору
 Re: объединение и календарь  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
или возможно UserName c пробелами
тогда сделайте

AND SUBSTRING(s.UserID, 8, 12) = ltrim(rtrim(sc.UserName))
7 ноя 13, 12:23    [15090098]     Ответить | Цитировать Сообщить модератору
 Re: объединение и календарь  [new]
da haroch
Member

Откуда:
Сообщений: 323
Статитстика сайта
таблицы Page 
PageID айдишник
PageURL
страница которую посетил пользователь

таблица Request таблица айдишников
Request
PageID
SessionID


таблица Session
SessionID
DateStart


таблица Calendar тут даты на год вперёд
CalData


таблица созданная руками чтобы отслеживать тех кто должен заходить в данный раздел но допустим не зашёл
Security
Post должность
UserName
FIO
PageURL это название категории
PageKategory ссылка на сайт 

ps случайно перепутала их местами=((ночь была уже.


а нужно получить таблицу
Calendar.CalData, Security.FIO, Security.PageKategory, Session.DataStart

запрос
SELECT DISTINCT 
 c.CalData
,sc.UserName 
,sc.PageKategory
,s.DateStart
FROM dbo.Calendar  c
CROSS JOIN dbo.Security  sc 
LEFT OUTER JOIN  dbo.Page p ON  p.PageURL = sc.PageKategory
LEFT OUTER JOIN dbo.Request  r ON r.PageID = p.PageID 
LEFT OUTER JOIN dbo.Session  s ON s.SessionID = r.SessionID  and convert(char(10), s.DateStart, 104) = convert(char(10), c.CalData, 104) 
AND SUBSTRING(s.UserID, 8, 12) = sc.UserName
ORDER BY  1,2,3


но похоже не совсем правильно...потому что я заходила в раздел Аудит деталей и узлов а он DateStart пустую ставит..вот мне и интересно это вообще реально сделать...или искать другие варианты..но я уже умучилась.
Calendar.CalData     Security.FIO         Security.PageKategory    Session.DataStart
2013-10-01 00:00:00.000	ABKuzyurin	/utk/Audit_auto.aspx	NULL
2013-10-01 00:00:00.000	ABKuzyurin	/utk/Ext_custom.aspx	NULL
2013-10-01 00:00:00.000	ABKuzyurin	/utk/Utk_order_month.aspx	NULL
2013-10-01 00:00:00.000	ABKuzyurin	/utk/Utk_reference.aspx	NULL
2013-10-01 00:00:00.000	ABNaumov	/utk/Audit_auto.aspx	NULL
2013-10-01 00:00:00.000	ABNaumov	/utk/Audit_det.aspx	NULL
2013-10-01 00:00:00.000	ABNaumov	/utk/Ext_custom.aspx	NULL
7 ноя 13, 12:24    [15090102]     Ответить | Цитировать Сообщить модератору
 Re: объединение и календарь  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
da haroch
StarikNavy,

да это долго..я просто как представила мне сейчас этого описывать=))
Конечно долго, лучше еще два дня поиграть в занимательную игру "угадай запрос".
Благо есть желающие :)
7 ноя 13, 12:30    [15090163]     Ответить | Цитировать Сообщить модератору
 Re: объединение и календарь  [new]
da haroch
Member

Откуда:
Сообщений: 323
Ruuu, ню я описала..не знаю понятно ли=))
7 ноя 13, 12:33    [15090201]     Ответить | Цитировать Сообщить модератору
 Re: объединение и календарь  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
в таблице сессий забыли указать UserID ну и тогда вроде только
по Page можно left join убрать так как не должно быть подвисших категорий
SELECT DISTINCT 
 c.CalData
,sc.UserName 
,sc.PageKategory
,r.SessionID  --- выведите для теста
,s.DateStart
FROM dbo.Calendar  c
CROSS JOIN dbo.Security  sc 
JOIN  dbo.Page p ON  p.PageURL = sc.PageKategory
LEFT OUTER JOIN dbo.Request  r ON r.PageID = p.PageID 
LEFT OUTER JOIN dbo.Session  s ON s.SessionID = r.SessionID  
and convert(char(10), s.DateStart, 104) = convert(char(10), c.CalData, 104) 
AND SUBSTRING(s.UserID, 8, 12) = sc.UserName
ORDER BY  1,2,3


так что если s.DateStart выводит NULL проверьте выдаёт ли r.SessionID и если выдаёт
проверяйте условие SUBSTRING(s.UserID, 8, 12) = sc.UserName
7 ноя 13, 12:41    [15090281]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить