Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
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] Ответить | Цитировать Сообщить модератору |
da haroch Member Откуда: Сообщений: 323 |
Вобщем мне нужно чтоб в первом столбце был полностью заполнен каледарь. |
7 ноя 13, 07:22 [15088660] Ответить | Цитировать Сообщить модератору |
LexusR Member Откуда: Novosibirsk Сообщений: 1887 |
поменяйте RIGHT JOIN на LEFT JOIN |
7 ноя 13, 07:23 [15088661] Ответить | Цитировать Сообщить модератору |
da haroch Member Откуда: Сообщений: 323 |
да я меняла не получается |
7 ноя 13, 07:25 [15088663] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
da haroch Member Откуда: Сообщений: 323 |
а сейчас у меня там ноль.и а ставится каледарь только тем кто уже осуществил вход. |
7 ноя 13, 07:38 [15088677] Ответить | Цитировать Сообщить модератору |
LexusR Member Откуда: Novosibirsk Сообщений: 1887 |
не верю если вы напишите 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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
da haroch Member Откуда: Сообщений: 323 |
Ruuu, ну да без вопроса он выводит все записи из таблицы каледарь...но проблема в том что когда делаю привязку..он категорям не ставит каледарь=(( |
7 ноя 13, 08:22 [15088731] Ответить | Цитировать Сообщить модератору |
LexusR Member Откуда: Novosibirsk Сообщений: 1887 |
Покажите запрос который выводит категорию но при этом календарь null. |
7 ноя 13, 08:32 [15088754] Ответить | Цитировать Сообщить модератору |
Jaffar Member Откуда: Сообщений: 633 |
da haroch, если в категриию "K_1" 5 мая 2013 года никто не заходил д.б. строчка 5.05.2013 К_1 NULL, NULL ? |
7 ноя 13, 08:35 [15088758] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Ruuu Member Откуда: Иркутск Сообщений: 4272 |
da haroch, Для того чтобы люди поняли, чего вы хотите, оформите свой вопрос в соответствии с правилами:
|
||
7 ноя 13, 10:14 [15089194] Ответить | Цитировать Сообщить модератору |
LexusR Member Откуда: Novosibirsk Сообщений: 1887 |
по логике и седьмому чуству (..тут предложили создать категории руками чтобы вижно было кто куда должен заходить и не зашёл...) таблица 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] Ответить | Цитировать Сообщить модератору |
da haroch Member Откуда: Сообщений: 323 |
LexusR, да вы меня правильно поняли...только должен быть sc.PageKategory за место p.PageURL |
7 ноя 13, 11:30 [15089622] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
StarikNavy Member Откуда: Москва Сообщений: 2397 |
da haroch, да приведите уже тестовые данные! со скриптами таблиц а то гадание по кофейной гуще |
7 ноя 13, 11:57 [15089842] Ответить | Цитировать Сообщить модератору |
da haroch Member Откуда: Сообщений: 323 |
StarikNavy, да это долго..я просто как представила мне сейчас этого описывать=)) |
7 ноя 13, 12:03 [15089904] Ответить | Цитировать Сообщить модератору |
LexusR Member Откуда: Novosibirsk Сообщений: 1887 |
проверьте условие AND SUBSTRING(s.UserID, 8, 12) = sc.UserName правильно ли вырезается SUBSTRING(s.UserID, 8, 12) |
||
7 ноя 13, 12:21 [15090074] Ответить | Цитировать Сообщить модератору |
LexusR Member Откуда: Novosibirsk Сообщений: 1887 |
или возможно UserName c пробелами тогда сделайте AND SUBSTRING(s.UserID, 8, 12) = ltrim(rtrim(sc.UserName)) |
7 ноя 13, 12:23 [15090098] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Ruuu Member Откуда: Иркутск Сообщений: 4272 |
Благо есть желающие :) |
||
7 ноя 13, 12:30 [15090163] Ответить | Цитировать Сообщить модератору |
da haroch Member Откуда: Сообщений: 323 |
Ruuu, ню я описала..не знаю понятно ли=)) |
7 ноя 13, 12:33 [15090201] Ответить | Цитировать Сообщить модератору |
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 | ![]() |