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

Цикл for в mssql

24.02.2011, 21:57. Показов 21956. Ответов 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
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru