Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/103: Рейтинг темы: голосов - 103, средняя оценка - 4.69
 Аватар для Landser
57 / 7 / 4
Регистрация: 18.04.2009
Сообщений: 429

Цикл for в mssql

24.02.2011, 21:57. Показов 21914. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
доброго времени суток. жизнь заставила сделать вот такую выборку
для простоты смоделирую так: таблица, поля фамилия, цвет.фамилия содержит данные о фамилиях людей,например петров, сидоров и тд., цвет-цвет карандашей, которые есть у человека, например: красный, жёлтый, синий, зелёный (это я модельный пример составил чтобы проще было) вот, и надо сделать вроде бы не хитрую такую выборку, чтобы данные представились след. образом
иванов: красных карандашей-15, жёлтых 8, корчиневых -0 и тд., то есть для каждого человека из списка фамилий (фамилии могут повторяться, те в таблице моут содержаться строки типа
иванов : 5 красных, 8 зелёных, 9 жёлтых и потом ещё строка иванов: 80 синих,12 красных и тд-пусть цветов всего 4 будет) надобно вывести количество карандашей каждого из 4-х цветов для этого человека
я думаю что это можно было бы замутить в цикле
для каждого [человек] из [ списка всех человеков] select [этот самый человек], count (*) from base where [человек] =[ этот самый человек] and [цвет] =[ красный] (и так для каждого цвета)
причём надо всё сделать одним запросом, чтобы потом это дело автоматизировать..
такое возможно впринципе в mssql? кто нибудь такое реализовывал? подскажите пожалуйста
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.02.2011, 21:57
Ответы с готовыми решениями:

Цикл в MSSQL
Помогите составить цикл, суть в чем... Есть сторбец "тип" и столбец "цепочка", если "тип" равен '1', то выполнять различные...

Совместимость datetime в MSSQL 7 и MSSQL 2000
Господа, помогите разобраться. Такая ситуация, понаписал скриптов под SQL 7, перенесли на SQL 2000, возникла проблема с форматом datetime. ...

Перенос БД из MSSQL 6.5 на MSSQL 7.0
Как перенести базу с сервера 6.5 на сервер 7.0? Серверы стоят на разных компьютерах. В помощи написано, что можно с помощью DTS Import /...

20
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
25.02.2011, 00:30
Landser, если не ошибаюсь, оператора for нет, есть только while. Но мне кажется, что данную задачу можно решить используя группировку в запросе (Group by)
1
 Аватар для Landser
57 / 7 / 4
Регистрация: 18.04.2009
Сообщений: 429
25.02.2011, 06:30  [ТС]
спасибо большое за ответ! а подскажите пожалуйста, каким образом можно с помощью group by победить?
я в sql не особо компетентен, и я сначала хотел написать что то типа :
select [Фамилия], count (*) from base where [цвет]= [ текущей фамилии]
и думал, чтобы пробежаться по всем фамилиям и обратиться к текущей и при этом всё одним запросом - как раз for и нужен
а каким образом здесь можно с помощью group by выкрутиться ?
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
25.02.2011, 06:42
Цитата Сообщение от Landser Посмотреть сообщение
подскажите пожалуйста, каким образом можно с помощью group by победить?
Почитай это или в учебниках по SQL посмотри
1
 Аватар для Landser
57 / 7 / 4
Регистрация: 18.04.2009
Сообщений: 429
25.02.2011, 23:19  [ТС]
спасибо!попытаюсь разобраться

Добавлено через 16 часов 33 минуты
спасибо за полезную ссылку, но я видимо немного не допонял..
мне надо получить выборку такую:
XML
1
2
3
[человек]   [красный_цвет]           [синий_цвет]  
 Петров           8                        24
 Сидоров          19                       15
я пытался написать так :
SQL
1
2
3
4
5
SELECT[человек],COUNT(TYPE) FROM base
--type- это признак цвета, type=1-красный, type=2-жёлтый и тд
WHERE   TYPE =1
GROUP BY [человек],TYPE
ORDER BY[человек]
-этот код возвращает только количество лишь красных карандашей для каждого [человек]
а вот каким обрзом мне получить в этом же запросе количество карандашей и других цветов для каждого из [человек] именно в таком виде как я указал выше?
я пробовал так,
SQL
1
2
3
4
SELECT [человек],TYPE,COUNT(TYPE) FROM base
WHERE     TYPE IN (1,2,3,4,)
GROUP BY [человек],TYPE
ORDER BY[человек]
так можно получить данные впринципе похожие на те, что мне нужны, но только немного по другому:
XML
1
2
3
4
[человек]  type  [количество]    
Петров       1         781
Петров       2         5
Петров       4         0
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
25.02.2011, 23:35
Landser, предполагаю, что нужны вложенные подзапросы
1
 Аватар для Landser
57 / 7 / 4
Регистрация: 18.04.2009
Сообщений: 429
26.02.2011, 22:16  [ТС]
ну да, я тоже думал об этом, вот только в какой части кода должна быть эта вложенность и какая, никак не соображу, я просто никогда ещё вложенных не делал, только простые статические в основном

Добавлено через 22 часа 24 минуты
Цитата Сообщение от nio Посмотреть сообщение
Landser, предполагаю, что нужны вложенные подзапросы
вот, делаю такой вложенный зарос, чтобы получить нужную выборку:
SQL
1
2
SELECT [человек] , SELECT (COUNT(TYPE) FROM table2 WHERE TYPE=1)  FROM table2 AS 'количество красных', SELECT (COUNT(TYPE) FROM table2 WHERE TYPE=2) FROM table2 AS 'количество синих'
GROUP BY  [человек] ,TYPE
пишет- Incorrect syntax near the keyword 'from', как по Вашему, почему такое ?
0
 Аватар для sanya0107
126 / 126 / 24
Регистрация: 14.02.2010
Сообщений: 289
26.02.2011, 22:32
Цитата Сообщение от Landser Посмотреть сообщение
ну да, я тоже думал об этом, вот только в какой части кода должна быть эта вложенность и какая, никак не соображу, я просто никогда ещё вложенных не делал, только простые статические в основном

Добавлено через 22 часа 24 минуты

вот, делаю такой вложенный зарос, чтобы получить нужную выборку:
SQL
1
2
SELECT [человек] , SELECT (COUNT(TYPE) FROM table2 WHERE TYPE=1)  FROM table2 AS 'количество красных', SELECT (COUNT(TYPE) FROM table2 WHERE TYPE=2) FROM table2 AS 'количество синих'
GROUP BY  [человек] ,TYPE
пишет- Incorrect syntax near the keyword 'from', как по Вашему, почему такое ?
Вроде бы с скобками попутал!
SQL
1
2
SELECT [человек] , (SELECT COUNT(TYPE) FROM table2 WHERE TYPE=1)  FROM table2 AS 'количество красных', (SELECT COUNT(TYPE) FROM table2 WHERE TYPE=2) FROM table2 AS 'количество синих'
GROUP BY  [человек] ,TYPE
вот так попробуй
1
 Аватар для Landser
57 / 7 / 4
Регистрация: 18.04.2009
Сообщений: 429
26.02.2011, 22:39  [ТС]
спасибо за ответ!
теперь пишет
Incorrect syntax near 'количество красных'. и Incorrect syntax near the keyword 'FROM'... непонятно
а вообще, по смыслу, должен ли такой код вернуть данные в таком виде, как я хочу ?
0
 Аватар для sanya0107
126 / 126 / 24
Регистрация: 14.02.2010
Сообщений: 289
26.02.2011, 22:48
SQL
1
2
SELECT [человек] , (SELECT COUNT(TYPE) FROM table2 WHERE TYPE=1) AS 'количество красных', (SELECT COUNT(TYPE) FROM table2  WHERE TYPE=2)  AS 'количество синих'
GROUP BY [человек]  ,TYPE
не заметил у вас лишние были FROM table2 после скобок!! и мне кажется группировка у вас должна проводиться по [человек] и все type по идеи не надо!! но это так размышления пробуйте!
1
 Аватар для Landser
57 / 7 / 4
Регистрация: 18.04.2009
Сообщений: 429
26.02.2011, 22:57  [ТС]
не заметил у вас лишние были FROM table2 после скобок!!
точно))
но теперь пишет почему то Invalid column name '[человек]', почему так, вообще неясно мне, ведь это поле есть , почему Invalid ..
ой, надо было from table2 добавить в конец запроса, но тогда у меня суммируется для каждого человека число красных и синих не для него одного а число красных и синих вообще всё
0
 Аватар для sanya0107
126 / 126 / 24
Регистрация: 14.02.2010
Сообщений: 289
26.02.2011, 23:01
Вообще то считается плохим тоном именовать таблицы и столбцы на русском языке

T-SQL
1
2
SELECT человек , (SELECT count(type) FROM table2 WHERE type=1) AS 'количество красных', (SELECT count(type) FROM table2  WHERE type=2)  AS 'количество синих' from table2
GROUP BY человек
данный запрос должен подсчитывать по каждому человеку количество записей с type=1 и количество записей с type=2

Если бы вы привели примеры таблиц было бы легче разобраться !!
1
 Аватар для Landser
57 / 7 / 4
Регистрация: 18.04.2009
Сообщений: 429
26.02.2011, 23:12  [ТС]
Цитата Сообщение от sanya0107 Посмотреть сообщение
T-SQL
1
2
SELECT человек , (SELECT count(type) FROM table2 WHERE type=1) AS 'количество красных', (SELECT count(type) FROM table2  WHERE type=2)  AS 'количество синих' from table2
GROUP BY человек
данный запрос должен подсчитывать по каждому человеку количество записей с type=1 и количество записей с type=2
вы уверены? а то он у меня считает по прежнему число красных и синих всего вообще.я завтра примеры таблиц приведу, а то меня с компа гонят))
спасибо большое
0
 Аватар для sanya0107
126 / 126 / 24
Регистрация: 14.02.2010
Сообщений: 289
27.02.2011, 08:57
T-SQL
1
2
3
4
5
SELECT t1.человек , 
(SELECT COUNT(*) FROM table2 as t2 WHERE (t2.type=1)and(t1.человек=t2.человек)) AS 'количество красных', 
(SELECT COUNT(*) FROM table2  as t3 WHERE (t3.type=2)and(t1.человек=t3.человек))  AS 'количество синих' 
FROM table2 as t1
GROUP BY t1.человек
1
 Аватар для Landser
57 / 7 / 4
Регистрация: 18.04.2009
Сообщений: 429
27.02.2011, 16:42  [ТС]
sanya0107, спасибо огромное!! как раз то делает, что мне и надо!! спасибо что уделили мне своё время и разобрались!
вот скажите пожалуйста только, что такое t1,t2-это видимо что то типа параметров?это какой тип запроса Вы применили? вложенный и параметрический ? я просто почитать хочу про это,интересно стало ))
0
 Аватар для sanya0107
126 / 126 / 24
Регистрация: 14.02.2010
Сообщений: 289
27.02.2011, 16:55
Хорошая книга по SQL это книга Грабера! а t1, t2, t3 это просто псевдонимы таблиц для удобства и сокращения текста и точной идентификации полей принадлежности к таблице ! тоже самое как вы используете в
T-SQL
1
(SELECT COUNT(*) FROM table2 AS t2 WHERE (t2.type=1)and(t1.человек=t2.человек)) AS 'количество красных'
1
 Аватар для Landser
57 / 7 / 4
Регистрация: 18.04.2009
Сообщений: 429
27.02.2011, 17:09  [ТС]
Грабер Мартин - SQL, 2003 -она видимо ? 672 страницы - ого-го))
хотя в аннотации написано
Классическая работа по SQL, полностью обновленная, содержащая описание SQL92 и SQL99
99 и 2000 не сильно отличаются ?
0
 Аватар для sanya0107
126 / 126 / 24
Регистрация: 14.02.2010
Сообщений: 289
27.02.2011, 17:19
В основном синтаксис везде одинаков! Есть маленькие нюансы у каждой СУБД!
1
 Аватар для Landser
57 / 7 / 4
Регистрация: 18.04.2009
Сообщений: 429
27.02.2011, 18:00  [ТС]
спасибо, буду читать))спасибо за помощь ещё раз
0
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,272
27.02.2011, 21:30
Цитата Сообщение от sanya0107 Посмотреть сообщение
T-SQL
1
2
3
4
5
SELECT t1.человек , 
(SELECT COUNT(*) FROM table2 as t2 WHERE (t2.type=1)and(t1.человек=t2.человек)) AS 'количество красных', 
(SELECT COUNT(*) FROM table2  as t3 WHERE (t3.type=2)and(t1.человек=t3.человек))  AS 'количество синих' 
FROM table2 as t1
GROUP BY t1.человек
Что-то мне удивительно, что ни один из местных "специалистов"
не знают общеизвестных стандартных приёмов:
T-SQL
1
2
3
4
5
SELECT человек
,SUM(CASE type WHEN 1 THEN 1 ELSE 0 END) [количество красных]
,SUM(CASE type WHEN 2 THEN 1 ELSE 0 END) [количество синих]
FROM table2
GROUP BY человек;
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.02.2011, 21:30
Помогаю со студенческими работами здесь

Переход с mssql Express 2008 R2 на mssql 2012
Уважаемые Гуру! Темы о mssql 2008 попадаются значительно чаще , чем о mssql 2012. Хочу перейти на 2012 enterprise. Есть ли...

Создать программу по всем 3 видам циклов...цикл с параметром,цикл с условием,цикл,и цикл с предусловием...
Найти сумму чисел 1 в квадрате до 10 c квадрате...операцию возведению в степень не использовать учесть особенности получения квадратного...

Совместимость datetime в MSSQL 7 и MSSQL 2000
Господа, помогите разобраться. Такая ситуация, понаписал скриптов под SQL 7, перенесли на SQL 2000, возникла проблема с форматом datetime. ...

Цикл с предусловием, цикл с постусловием и цикл с параметром
Объясните пожалуйста как делать эти циклы. У меня не получается. Можете сделать как на фото, или на подобии. Заранее спасибо)

Цикл: Вычислить значение выражения. Как вывести формулу и сделать цикл while?
Последовательно вводятся N целых чисел. Найти минимальное из них. #include<stdio.h> #include<locale.h> #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru