Нумидийцы восхитительно исполнили задачу. Когда они устроили у лагерных ворот шум и беспорядок (по Полибию, едва только было замечено их приближение), Семпроний не раздумывая, вывел против них свою конницу, а позже и остальных солдат. Однако проделал он это слишком быстро. Его воины вышли на поле голодными и недостаточно тепло одетыми, кони были не кормлены. Когда римляне вступили в полосу речного тумана, преследуя отходящих нумидийцев, они все больше и больше мерзли. В реке холодная вода доходила им до уровня груди, так что, когда солдаты Семпрония вышли на другой берег, они едва могли держать в руках оружие.
В середине декабря к Треббии подошла армия Тиберия Семпрония Лонга. Семпроний рвался в бой, надеясь разгромить Ганнибала до окончания его консульских полномочий. Сципион считал, что не нужно торопить события, так как время работает на римлян. Но Сципион заболел, и Семпроний фактически стал единоличным командующим. Ганнибал заставил римлян переправиться через Треббию.
Карфагенские воины тем временем грелись у костров, растирались оливковым маслом и завтракали. Получив условленный сигнал о том, что римляне перешли через реку, Ганнибал вывел свои войска в поле. Впереди он поставил легкую пехоту (8000 человек), за ними — тяжеловооруженную пехоту (иберы, галлы и ливийцы; 20000 человек), а на обоих флангах — 9000 всадников и слонов.
Разгорелось ожесточенное сражение, которое длилось, пока из засады не выскочил кавалерийский отряд под командованием Магона, который атаковал тыл римлян. Семпроний, увидев, что его всадники чрезмерно заинтересовались преследованием нумидийцев, то отступавших, то вновь переходивших в контратаку, и подвергавших себя чрезмерной опасности, приказал им отступить и присоединиться к основным силам. В центре Семпроний выстроил 18000 римлян; 20000 союзников и тех, кто имел права латинского гражданства; сверх этого воины из галльского племени кеноманов а на флангах — кавалерию (около 4000 воинов).
Сражение начали балеары, вынуждавшие римских копьеметателей отступить, а затем присоединившиеся к карфагенским всадникам, наносившим фланговый удар. Римская конница была смята превышаемой по численности кавалерией противника, балеарами и слонами. Тяжеловооруженные пехотинцы дрались с большим напором и ожесточением, но безрезультатно. Неожиданно для римлян в их тыл ударил из засады отряд Магона и привел заднюю шеренгу римлян в недоумение. Оказавшись в окружении, римская пехота, мужественно борясь, прорвала боевую линию карфагенян и принудила повернуть назад слонов, едва не бросившихся на самих пунийцев. Ганнибал приказал отвести слонов на фланги и повернуть их против кеноманов, которые обратились в паническое бегство. В этих условиях 10 000 римских пехотинцев пробились сквозь карфагенские ряды и вырвались из окружения. Не имея возможности вернуться в свой лагерь, они отступили к Плаценции, а оттуда в Кремону ушли под командованием Сципиона и подразделения, остававшиеся во время боя в лагере.
Карфагеняне одержали победу и на этот раз, но со значительными потерями. Битва закончилась сокрушительным поражением римлян. Победа при Требии отдала Ганнибалу Цизальпинскую Галлию и позволила привлечь на свою сторону все племена, населявшие этот регион. После этой победы Ганнибал переправился через Треббию и направился в Болонью, где и провел зиму.
С наступлением весны 217 года до н. э. Ганнибал двинулся к Апеннинам, перешел их через перевал Порретта и вышел к Пистое. В Риме консулами были избраны Гай Фламиний Непот и Гней Сервилий Гемин. В начале кампании 217 года до н. э. две римские армии — Фламиния и Сервилия — были поставлены на путях наступления Ганнибала к Риму: первый — у Арретия, второй — возле Аримина. Но он, обойдя с левого крыла армию Фламиния, стал угрожать ей связью с Римом, выбрав кратчайший путь — на Парму и через Клузийские болота, затопленные в это время разлитием реки Арно.