powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сложный запрос по SQL
2 сообщений из 2, страница 1 из 1
Сложный запрос по SQL
    #32857690
laifik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подобный вопрос я уже задавала, но этот запрос еще сложнее, чем тот, с которым разобралась. Правда, участники форума несколько были удивлены решением, которое у меня получилось. Но сразу оговорю, что запрос использую в C++ Builder, а там свои законы. Поэтому такое написание кода
авторLEFT(GostID, 6) <> LEFT(GostID, 12) вполне естественно для Си.
А вопрос нынче такой:
в прикрепленном файле есть такая информация по столбцам GostID и Massa.
Нужно произвести суммирование по строкам:
1) По разделам 01, 02 и т.д.
2) По подразделам 0101, 0201 и т.д.
3) По группам 010101, 020301 и т.д.
Суммирование должно происходить таким образом: нужно сложить результаты сумм по разделам от 01 до 13 включительно;
10 % от группы 140102;
10 % от группы 140103
10 % от подраздела 1402
10 % от раздела 16
100 % от разделов 17 и 18.
Когда у меня не перемешивались разделы с подразделами и группами, то запрос, например, для суммирования раздела выглядит так:
авторSELECT SUM(Massa) AS SUMMP, SUM(Massa * PlechoX) AS SUMMX,
SUM(Massa * PlechoY) AS SUMMY, SUM(Massa * PlechoZ) AS SUMMZ,
SUM(dmhP) AS SUMDM, SUM(Prozent) AS SUMPROZ, LEFT(GostID, 2) AS RASD,
COUNT(CardID) AS COUSAP, KodSyst, SUM(Massa * PlechoX) / SUM(Massa) AS SUMX,
SUM(Massa * PlechoY) / SUM(Massa) AS SUMY, SUM(Massa * PlechoZ) / SUM(Massa) AS SUMZ
FROM dbo.Loading_Card_20870
Where KodSyst =12
GROUP BY LEFT(GostID, 2), KodSyst
HAVING (LEFT(GostID, 2) >= '01') AND
(LEFT(GostID, 2) < '16') OR
(LEFT(GostID, 2) >= '17') AND
(LEFT(GostID, 2) < '19')
UNION
SELECT SUM(Massa*0.5) AS SUMMP, SUM(Massa * PlechoX*0.5) AS SUMMX,
SUM(Massa * PlechoY*0.5) AS SUMMY, SUM(Massa * PlechoZ*0.5) AS SUMMZ,
SUM(dmhP*0.5) AS SUMDM, SUM(Prozent*0.5) AS SUMPROZ, LEFT(GostID, 2) AS RASD,
COUNT(CardID) AS COUSAP, KodSyst, SUM(Massa * PlechoX*0.5) / SUM(Massa*0.5) AS SUMX,
SUM(Massa * PlechoY*0.5) / SUM(Massa*0.5) AS SUMY, SUM(Massa * PlechoZ*0.5) / SUM(Massa*0.5) AS SUMZ
FROM dbo.Loading_Card_20870
Where KodSyst =12
GROUP BY LEFT(GostID, 2), KodSyst
HAVING (LEFT(GostID, 2) > '15') AND
(LEFT(GostID, 2) < '17')
ORDER BY LEFT(GostID, 2)
Т.е., складываются все строки разделов от 01 до 15 и от 17 до 18 плюс 50% от раздела 16.
Для продраздела запрос аналогичный:
авторSELECT SUM(Massa) AS SUMMP, SUM(Massa * PlechoX) AS SUMMX,
SUM(Massa * PlechoY) AS SUMMY, SUM(Massa * PlechoZ) AS SUMMZ,
SUM(dmhP)AS SUMDM, SUM(Prozent) AS SUMPROZ, LEFT(GostID, 4) AS RASD,
COUNT(CardID) AS COUSAP, KodSyst, SUM(Massa * PlechoX) / SUM(Massa)AS SUMX,
SUM(Massa * PlechoY) / SUM(Massa) AS SUMY, SUM(Massa * PlechoZ) / SUM(Massa) AS SUMZ
FROM dbo.Loading_Card_20870
Where KodSyst =12 AND
(LEFT(GostID, 2) <> LEFT(GostID, 4))
GROUP BY LEFT(GostID, 4), KodSyst
HAVING (LEFT(GostID, 4) >= '01') AND
(LEFT(GostID, 4) < '16') OR
(LEFT(GostID, 4) >= '17') AND
(LEFT(GostID, 4) < '19')
UNION
SELECT SUM(Massa * 0.5) AS SUMMP, SUM(Massa * PlechoX * 0.5) AS SUMMX,
SUM(Massa * PlechoY * 0.5) AS SUMMY, SUM(Massa * PlechoZ * 0.5) AS SUMMZ,
SUM(dmhP * 0.5) AS SUMDM, SUM(Prozent * 0.5) AS SUMPROZ, LEFT(GostID, 4) AS RASD,
COUNT(CardID) AS COUSAP, KodSyst,
SUM(Massa * PlechoX * 0.5) / SUM(Massa * 0.5) AS SUMX,
SUM(Massa * PlechoY * 0.5) / SUM(Massa * 0.5) AS SUMY,
SUM(Massa * PlechoZ * 0.5) / SUM(Massa * 0.5) AS SUMZ
FROM dbo.Loading_Card_20870
Where KodSyst =12 AND
(LEFT(GostID, 2) <> LEFT(GostID, 4))
GROUP BY LEFT(GostID, 4), KodSyst
HAVING (LEFT(GostID, 4) > '15') AND (LEFT(GostID, 4) < '17')
ORDER BY LEFT(GostID, 4)
А вот как справиться с этой задачей, ума не приложу.
Может специалисты подскажут, а может такой запрос вовсе не реален?
...
Рейтинг: 0 / 0
Сложный запрос по SQL
    #32860051
laifik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SQL, доступ через ADO.
Вот что мне пока удалось сделать
авторSELECT SUM(Massa) AS SUMMP
FROM Table1
Where KodSyst =12
GROUP BY LEFT(GostID, 2), KodSyst
HAVING (LEFT(GostID, 2) >= '01') AND (LEFT(GostID, 2) < '14') OR
(LEFT(GostID, 2) >= '17') AND (LEFT(GostID, 2) < '19')
UNION
SELECT SUM(Massa*0.1) AS SUMMP
FROM Table1
WHERE KodSyst =12 AND (GostID LIKE '140102%')
GROUP BY LEFT(GostID, 2), KodSyst

UNION
SELECT SUM(Massa*0.1) AS SUMMP
FROM Table1
WHERE KodSyst =12 AND (GostID LIKE '1402%')
GROUP BY LEFT(GostID, 2), KodSyst

UNION
SELECT SUM(Massa) AS SUMMP
FROM Table1
Where KodSyst =12 AND (GostID LIKE '140101%')
GROUP BY LEFT(GostID, 2), KodSyst

Я отрабатываю пока суммирование по разделу, чтобы понять структуру данного запроса. В результате у меня получились суммированные массы, но в таком порядке:
авторGostID - Massa
01 - 12,5
02 - 4,6
...
13 - 7,2
14 - 10
14 - 5,5
14 - 6
17 - 8
18 - 7
Как сделать, чтобы три строки 14 раздела объединились в одну?
Нужно (если упустить все разделы, кроме 14), то
автор14 - 21,5
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сложный запрос по SQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]