Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.03.2010, 07:04   #1
NIKOLASCS
Пользователь
 
Регистрация: 25.09.2009
Сообщений: 17
По умолчанию Запрос с выборкой

Формирую запрос из Microsoft Query, не могу отфильтровать поле bypass_sheet.SheetDate на март месяц. Поле имеет диапазон дат на текущий месяц. Пробовал в Select использовать функцию Month(bypass_sheet.SheetDate), выдает ошибку. Подскажите новичку правильное написание запроса

SELECT Cust.CustomerID, Cust.LicNumber, Cust.FirstName, Cust.TownName, Cust.StreetName, Cust.HouseNumber, Cust.Apartment, Customers.Litera, bypass_sheet.SheetDate, bypass_sheet_item.OldMeasure, bypass_sheet_item.Measure FROM Gas.dbo.bypass_sheet bypass_sheet, Gas.dbo.bypass_sheet_item bypass_sheet_item, Gas.dbo.Cust Cust, Gas.dbo.Customers Customers WHERE Cust.CustomerID = Customers.CustomerID AND bypass_sheet_item.CustomerID = Customers.CustomerID AND bypass_sheet.SheetID = bypass_sheet_item.SheetID AND ((bypass_sheet.SheetDate>={ts '2009-03-01 00:00:00'})) ORDER BY Cust.CustomerID
NIKOLASCS вне форума Ответить с цитированием
Старый 27.03.2010, 14:29   #2
edgy
Форумчанин
 
Регистрация: 15.06.2008
Сообщений: 271
По умолчанию

Hello, NIKOLASCS!

Цитата:
Сообщение от NIKOLASCS Посмотреть сообщение
выдает ошибку
1) Что за ошибку выдает?
2) Что именно не получается?
3) Ну и не плохо было бы привести структуру используемых таблиц...
edgy вне форума Ответить с цитированием
Старый 27.03.2010, 16:55   #3
NIKOLASCS
Пользователь
 
Регистрация: 25.09.2009
Сообщений: 17
По умолчанию Пример

Я новичок в SQL, поэтому мне нужен пример запроса с выборкой по таблице дата.
Какая структура сказать пока не могу, потому что не знаю какие они бывают, модель явно реляционная. Если своими словами: Имеем таблицы перечисленные в Select, обьединение между таблицами внутреннее, по ключевым столбцам (ИмяТаблицы.ПолеID).
Не получается правильно изменить условие bypass_sheet.SheetDate>={ts '2009-03-01 00:00:00'} на bypass_sheet.SheetDate = 'March' .
NIKOLASCS вне форума Ответить с цитированием
Старый 27.03.2010, 17:54   #4
edgy
Форумчанин
 
Регистрация: 15.06.2008
Сообщений: 271
По умолчанию

Если я правильно вас понял, то, наверное, так ...
Код:
   AND Month(bypass_sheet.SheetDate) = 3
Оно самое?
edgy вне форума Ответить с цитированием
Старый 31.03.2010, 06:22   #5
NIKOLASCS
Пользователь
 
Регистрация: 25.09.2009
Сообщений: 17
По умолчанию Выборка за 12 месяцев

Спасибо, помогло!

Как можно выбрать для каждой записи из Cust.CustomerID значение bypass_sheet_item.OldMeasure за 12 месяцев, т.е. мне нужно разбить строки bypass_sheet_item.OldMeasure на 12 столбцов.

SELECT Cust.CustomerID, Cust.LicNumber, Cust.FirstName, Cust.TownName, Cust.StreetName, Cust.HouseNumber, Cust.Apartment, Customers.Litera, bypass_sheet.SheetDate, bypass_sheet_item.OldMeasure, bypass_sheet_item.Measure FROM Gas.dbo.bypass_sheet bypass_sheet, Gas.dbo.bypass_sheet_item bypass_sheet_item, Gas.dbo.Cust Cust, Gas.dbo.Customers Customers WHERE Cust.CustomerID = Customers.CustomerID AND bypass_sheet_item.CustomerID = Customers.CustomerID AND bypass_sheet.SheetID = bypass_sheet_item.SheetID AND Month(bypass_sheet.SheetDate) = 3 AND Year(bypass_sheet.SheetDate) = 2010 ORDER BY Cust.CustomerID
NIKOLASCS вне форума Ответить с цитированием
Старый 31.03.2010, 20:03   #6
edgy
Форумчанин
 
Регистрация: 15.06.2008
Сообщений: 271
По умолчанию

Цитата:
Сообщение от NIKOLASCS Посмотреть сообщение
т.е. мне нужно разбить строки bypass_sheet_item.OldMeasure на 12 столбцов.
Если в результате выборки количество выводимых столбцов известно и постоянно, то для решения можно использовать оператор PIVOT. В противном случае (когда количество выводимых столбцов заранее неизвестно) это решается с использованием курсоров. Но в любом случае при больших объемах данных получите тормоза. Так что лучше подумайте либо над перепроектированием БД, либо над тем, как представить данные в несколько другом виде.

Но тем не менее, сделаем так как нужно именно Вам.
Итак, в вашем случае количество выводимых столбцов постоянно: 12 (OldMeasure) + 8 (информация о Customer). Значит, для решения будем использовать PIVOT

Ну и собственно, сам запрос:
Код:
SELECT CustomerID, 
	LicNumber, 
           FirstName, 
           TownName, 
           StreetName, 
           HouseNumber, 
           Apartment, 
           Litera,
           [1] AS '1', 
           [2] AS '2', 
           [3] AS '3', 
           [4] AS '4',  
           [5] AS '5', 
           [6] AS '6', 
           [7] AS '7',
           [8] AS '8', 
           [9] AS '9', 
           [10] AS '10', 
           [11] AS '11', 
           [12] AS '12'
FROM 
 ( SELECT Cust.CustomerID, 
       Cust.LicNumber, 
       Cust.FirstName, 
       Cust.TownName, 
       Cust.StreetName, 
       Cust.HouseNumber, 
       Cust.Apartment, 
       Customers.Litera, 
       Month( bypass_sheet.SheetDate ) as SheetDate, 
       bypass_sheet_item.OldMeasure
  FROM bypass_sheet bypass_sheet, 
       bypass_sheet_item bypass_sheet_item, 
       Cust Cust, 
       Customers Customers 
 WHERE Cust.CustomerID = Customers.CustomerID 
   AND bypass_sheet_item.CustomerID = Customers.CustomerID 
   AND bypass_sheet.SheetID = bypass_sheet_item.SheetID  
  ) AS CustomerMeasureData
PIVOT
( MIN( OldMeasure ) 
   FOR SheetDate in ( [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12] )
) AS pvt
ORDER BY CustomerID
edgy вне форума Ответить с цитированием
Старый 01.04.2010, 12:35   #7
NIKOLASCS
Пользователь
 
Регистрация: 25.09.2009
Сообщений: 17
По умолчанию Ошибка

Запрос не обрабатывается, выдает ошибку: Incorrect syntax near 'Pivot'.
Можете пояснить для чего нужен оператор Pivot , Функция Min() и строки с номерами [1], [2].....
NIKOLASCS вне форума Ответить с цитированием
Старый 01.04.2010, 12:42   #8
edgy
Форумчанин
 
Регистрация: 15.06.2008
Сообщений: 271
По умолчанию

Цитата:
Сообщение от NIKOLASCS Посмотреть сообщение
Запрос не обрабатывается, выдает ошибку: Incorrect syntax near 'Pivot'.
Версия SQL Server'a какая?
PIVOT появился в SQL SERVER 2005

Последний раз редактировалось edgy; 01.04.2010 в 13:02. Причина: Дополнения
edgy вне форума Ответить с цитированием
Старый 01.04.2010, 17:46   #9
NIKOLASCS
Пользователь
 
Регистрация: 25.09.2009
Сообщений: 17
По умолчанию Аналогичное решение

На сервере стоит SQL 2000 и с этим ни чего не поделаешь. Может быть есть аналог оператора Pivot, или иное решение? Не хочу перегружать программу лишним кодом на VBA, считаю решение на основе запроса наиболее гибким.
NIKOLASCS вне форума Ответить с цитированием
Старый 01.04.2010, 18:39   #10
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

воспользуйся case-ом
soleil@mmc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа с выборкой Inveerto Общие вопросы Delphi 3 10.04.2011 19:32
Проблема с выборкой Nightwolf Microsoft Office Access 1 01.05.2009 09:34
Вопрос с выборкой MHz Microsoft Office Access 2 13.11.2008 23:19
Помогите с выборкой VRF Microsoft Office Excel 5 06.11.2008 01:45
Как оптимизировать запрос MySQL с выборкой из двух таблиц. Johnatan SQL, базы данных 6 13.04.2008 03:10