|
|
|
Сложный запрос по SQL
|
|||
|---|---|---|---|
|
#18+
Подобный вопрос я уже задавала, но этот запрос еще сложнее, чем тот, с которым разобралась. Правда, участники форума несколько были удивлены решением, которое у меня получилось. Но сразу оговорю, что запрос использую в 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) А вот как справиться с этой задачей, ума не приложу. Может специалисты подскажут, а может такой запрос вовсе не реален? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2005, 16:00 |
|
||
|
Сложный запрос по SQL
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2005, 19:56 |
|
||
|
|

start [/forum/topic.php?fid=47&tid=1854447]: |
0ms |
get settings: |
8ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
192ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 215ms |
| total: | 485ms |

| 0 / 0 |
