Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Microsoft SQL Server

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

Открыть новую тему     Написать ответ в эту тему

Megard

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
MICROSOFT SQL SERVER
 
тема посвящена выяснению ответов на вопросы, касающихся установки, функционирования и использования Microsoft SQL Server; также обсуждаются вопросы, касающиеся использования T-SQL (диалект SQL-языка, используемого в этой версии сервера)
 
популярные ответы на популярные вопросы "где скачать?" и "чем сломать?" можно найти здесь

 
 
Официальная документация:
SQL Server 2005 Books Online (original/english, 135MB, september 2007);
SQL Server 2005 Books Online (перевод/русский, 148MB, январь 2009);
 
 
Официальные обновления:
[для версий, начиная с 9.0.3042] / [полный перечень обновлений / зеркало]
03/06/2007: KB933508 (9.0.3042 > 9.0.3050);
04/03/2007: KB934458 (9.0.3050 > 9.0.3054);
04/03/2007: KB934459 (9.0.3054 > 9.0.3159);
06/28/2007: KB936305 (9.0.3159 > 9.0.3175);
 
 
Альтернативные источники информации:
sql.ru - очень полезный ресурс с говорящим за себя названием; пожалуй, лучший (если не единственный) на просторах ru'нета; кроме форумов есть большая подборка статей, FAQ, и прочее.

Всего записей: 135 | Зарегистр. 13-09-2002 | Отправлено: 11:49 18-07-2003 | Исправлено: niichavo, 16:13 02-04-2010
andyzubov

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
select [ItemRelation] ,[DocumentNum] [DocumentYear], count(*)  
from xxx where ispromo>0
group by [ItemRelation] ,[DocumentNum] [DocumentYear]
having (count(*)>=2 and count(*)<=4)
 
попробуй через group by и having. извини пишу наобум, не факт что правильно

Всего записей: 493 | Зарегистр. 02-04-2015 | Отправлено: 15:40 12-06-2018
perceptron

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как-то так:

Код:
 
DECLARE @t TABLE(ItemRelation INT, SaleCount NUMERIC(10, 8), IsPromo BIT, DocumentNum INT, DocumentYear INT)
INSERT INTO @t
SELECT 11202, 8.85947691, 0, 137, 218
UNION ALL
SELECT 11202, 9.450108704, 0, 137, 218
UNION ALL
SELECT 11202, 12.40326767, 1, 137, 218
UNION ALL
SELECT 11202, 25.98779894, 1, 137, 218
UNION ALL
SELECT 11202, 63.19760196, 1, 137, 218
UNION ALL
SELECT 11202, 8.85947691, 0, 138, 218
UNION ALL
SELECT 11202, 9.450108704, 0, 138, 218
UNION ALL
SELECT 11202, 12.40326767, 1, 138, 218
 
SELECT dat.*  
FROM
(  
  SELECT  
    t.ItemRelation
    ,t.DocumentNum
    ,t.DocumentYear
    ,t.SaleCount
    ,t.IsPromo
    ,SUM(CAST(IsPromo AS INT)) OVER(PARTITION BY t.ItemRelation, t.DocumentNum, t.DocumentYear) AS PromoSum
  FROM @t AS t
) AS dat
WHERE dat.PromoSum > 1 AND dat.PromoSum < 5
 

Всего записей: 433 | Зарегистр. 23-12-2005 | Отправлено: 14:34 13-06-2018 | Исправлено: perceptron, 14:34 13-06-2018
andyzubov

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
а чего добиться то хотел?

Всего записей: 493 | Зарегистр. 02-04-2015 | Отправлено: 14:39 13-06-2018
perceptron

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
как я понял, он хотел вывести в выборке только строки тех "страт" (групп), у которых число единиц в Ispromo входит в диапазон.

Всего записей: 433 | Зарегистр. 23-12-2005 | Отправлено: 14:50 13-06-2018
andyzubov

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ну тогда уж
 
  SELECT  
    t.ItemRelation, t.DocumentNum, t.DocumentYear, SUM(t.SaleCount) AS SaleCount, COUNT(*) AS PromoSum
  FROM @t AS t
  WHERE IsPromo=1
  GROUP BY  
    t.ItemRelation,t.DocumentNum,t.DocumentYear
  HAVING COUNT(*)>1 AND COUNT(*)<5

Всего записей: 493 | Зарегистр. 02-04-2015 | Отправлено: 15:00 13-06-2018
perceptron

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В вопросе не звучало слов подсчитать сумму, а лишь вывести все строки подпадающие под условие выборки.

Всего записей: 433 | Зарегистр. 23-12-2005 | Отправлено: 16:43 13-06-2018 | Исправлено: perceptron, 16:44 13-06-2018
andyzubov

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Можно убрать SUM(t.SaleCount) AS SaleCount, ничего не изменится

Всего записей: 493 | Зарегистр. 02-04-2015 | Отправлено: 16:50 13-06-2018
perceptron

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Опять мы говорим о разном. Ваш запрос не возвращает все строки "страт" у которых число IsPromo = 1 в количестве от 2 до 4. В эти строки входят данные как с IsPromo = 0 так и IsPromo =1 в группе  [ItemRelation] ,[DocumentNum] [DocumentYear]  

Всего записей: 433 | Зарегистр. 23-12-2005 | Отправлено: 17:03 13-06-2018 | Исправлено: perceptron, 17:04 13-06-2018
andyzubov

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ну вроде условие WHERE IsPromo=1, т.е группировка будет уже только по записям с этим условием

Всего записей: 493 | Зарегистр. 02-04-2015 | Отправлено: 17:08 13-06-2018
perceptron

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
так вот это и есть неверно - в понятие "страта" входят все записи как с IsPromo=1 так IsPromo=0,
Но вывести надо только те группы "страт", в которых число IsPromo=1 в диапазоне 2..4

Всего записей: 433 | Зарегистр. 23-12-2005 | Отправлено: 17:17 13-06-2018
andyzubov

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Наверное мы неправильно понимаем задание, мне казалось надо найти группы из комбинации полей  [ItemRelation] ,[DocumentNum] [DocumentYear] у которых количество значений IsPromo в группе от 1 до 4.
 
Вот что возвращает твой запрос
"ItemRelation";"DocumentNum";"DocumentYear";"SaleCount";"IsPromo";"PromoSum"
11202;137;218;8,859;false;3
11202;137;218;9,45;false;3
11202;137;218;12,403;true;3
11202;137;218;25,988;true;3
11202;137;218;63,198;true;3
 
Вот что возвращает мой  
"ItemRelation";"DocumentNum";"DocumentYear";"PromoSum"
11202;137;218;3
 
Мой результат кажется мне более адекватным

Всего записей: 493 | Зарегистр. 02-04-2015 | Отправлено: 09:03 14-06-2018
Alexzzy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
perceptron
andyzubov
Раз уж автор вопроса пропал, то замечу, что вопрос сформулирован достаточно конкретно.
where...group by...having в ответе, т.е. как andyzubov написал.

Всего записей: 1474 | Зарегистр. 10-07-2013 | Отправлено: 15:17 14-06-2018 | Исправлено: Alexzzy, 15:18 14-06-2018
hawk2hawk



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Хелпуйте, громадяне!  
По жаре совсем башка засахарилась. Чувствую, что решение лежит на поверхности, но не могу впитать, как и что.
Есть две таблицы. В первой таблице(назовем ее T1) есть два столбца:
ID1, тип строк - 16тиразрядный бинарник
USER, тип строк - строковое значение(Иванов, Петров, Сидоров)
Во второй таблице(T2) два столбца:
ID2, со значениями, идентичными первой таблице столбца ID1
MyDate, тип строк - datetime
Задача: нужно по некоторым пользователям менять значение даты в таблице T2
Делаем запрос(опускаю незначительный синтаксис , чтобы не загромождать сообщение):
update T2
set MyDate = @наша_до_этого_задекларированная_переменная
where ID2=многабукофцифорь
всё суперски, кроме одного: приходится сначала в таблице T1 искать, какой ID1 принадлежит юзеру Иванову(скажем) а потом это значение вставлять в ID2=...
Хотелка: можно как-нить сначала объединить таблицы T1 и T2(select бла-бла), чтобы в запросе не париться с ID пользователя, а вставлять его фамилию, типа update бла-бла where USER = 'Иванов'
Спасибо и удачи.
 

Всего записей: 481 | Зарегистр. 11-11-2010 | Отправлено: 12:03 26-07-2018 | Исправлено: hawk2hawk, 12:05 26-07-2018
andyzubov

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
update from, оно?
https://docs.microsoft.com/en-us/sql/t-sql/queries/update-transact-sql?view=sql-server-2017#OtherTables

Всего записей: 493 | Зарегистр. 02-04-2015 | Отправлено: 12:15 26-07-2018
DenisConqueror

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Можно и при таком синтаксисе вместо "многабукофцифор" написать:
update T2  
set MyDate = @наша_до_этого_задекларированная_переменная  
where ID2= (SELECT top(1) id1 FROM T1 WHERE user = 'ФАМИЛИЯ' )
, top(1) на случай, если однофамильцев много, либо сразу всех:
 
update T2  
set MyDate = @наша_до_этого_задекларированная_переменная  
where ID2 in (SELECT id1 FROM T1 WHERE user = 'ФАМИЛИЯ' )
 
По поводу update from почитайте (постом выше), выглядеть будет немного иначе:
 
UPDATE T2  
  set MyDate = @наша_до_этого_задекларированная_переменная
 
FROM  T2
    INNER JOIN T1 ON T1.ID1=T2.ID2
WHERE
  T1.USER = 'Фамилия'

Всего записей: 19 | Зарегистр. 17-05-2009 | Отправлено: 13:55 26-07-2018 | Исправлено: DenisConqueror, 14:05 26-07-2018
andyzubov

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SET DATEFORMAT dmy
 
DECLARE @t1 TABLE (id1 INT, fam VARCHAR(20))
DECLARE @t2 TABLE (id2 INT, dt DATE)
 
INSERT INTO @t1 VALUES (1,'Иванов'), (2,'Петров'), (3, 'Сидоров')
INSERT INTO @t2 VALUES (1, '01.01.2018'), (2, '02.01.2018'), (3, '03.01.2018'), (1, '05.01.2018')
 
SELECT * FROM @t2 -- выведем значения ДО
 
UPDATE @t2 SET dt='10.01.2018'
FROM @t2 t2
JOIN @t1 t1 ON (t1.id1=t2.id2)
WHERE t1.fam LIKE 'Иванов'
 
SELECT * FROM @t2 -- ПОСЛЕ
 
По мне join предпочтительнее подзапроса

Всего записей: 493 | Зарегистр. 02-04-2015 | Отправлено: 14:17 26-07-2018 | Исправлено: andyzubov, 14:18 26-07-2018
hawk2hawk



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DenisConqueror
(про себя):
Пилять!  
Как же мне стыдно?!!
(вслух):
Спасибо, дорогая редакция!
 
 
Добавлено:
DenisConqueror
А какой запрос будет считаться более изящным и менее ресурсоёмким для скулы
WHERE  ID2 IN (SELECT ID1 FROM T1 WHERE USER = 'Фамилия' )  
или
INNER JOIN T1 ON T1.ID1=T2.ID2 WHERE  T1.USER = 'Фамилия'  

Всего записей: 481 | Зарегистр. 11-11-2010 | Отправлено: 14:23 26-07-2018 | Исправлено: hawk2hawk, 14:42 26-07-2018
andyzubov

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
я конечно план запроса не смотрел, но мне кажется JOIN лучше IN, хотя надо проверять как анализатор сработает

Всего записей: 493 | Зарегистр. 02-04-2015 | Отправлено: 14:42 26-07-2018
hawk2hawk



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
andyzubov
Ну, в принципе, не столь существенно(ИМХО).
Раз в сутки утром отработает запросик, пока пользователей нет в одинэске.
ЗЫ. Просто прихожу на работу позже, когда уже народ в базе, а политика запрета редактирования/проведения документов задним числом уж слишком мудрёная в конторе:
есть небожители(кому можно развлекаться с доками до рождества Христова), есть жрецы(кто может править в течении квартала), есть простые смертные(кому в течение месяца можно), а есть и бесправные(вот тебе от реалтайма три дня на всё-про-всё и крутись как хочешь)
Спасибо, Энди
 

Всего записей: 481 | Зарегистр. 11-11-2010 | Отправлено: 14:56 26-07-2018 | Исправлено: hawk2hawk, 14:57 26-07-2018
DenisConqueror

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Проверил не SELECT (вместо UPDATE) с IN и JOIN - планы выполнения абсолютно идентичны, так что...
Я бы выбрал вариант с JOIN, так как он нагляднее, опять же, с моей точки зрения.

Всего записей: 19 | Зарегистр. 17-05-2009 | Отправлено: 14:57 26-07-2018
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Microsoft SQL Server


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru