Update: An alternative approach with a minor modification of the code in OP:
- Reverse the columns in
q1
: i.e. use q1 = qq[[All, {2, 1}]];
, and
- Use
BarSpacing -> {0, 1}
in both charts
q1 = qq[[All, {2, 1}]]; q2 = qq[[All, {1, 3}]];
qw1 = BarChart[q1, BarSpacing -> {0, 1}, Frame -> {Left},
ChartStyle -> Darker[Red], FrameStyle -> Darker[Red],
ImagePadding -> 30, ImageSize -> 500, ImageMargins -> 4];
qw2 = BarChart[q2, BarSpacing -> {0, 1}, Frame -> {Right},
FrameTicks -> All, ChartStyle -> Darker[Blue],
FrameStyle -> Darker[Blue], ImageMargins -> 4,
ImagePadding -> 30,
ImageSize -> 500];
Overlay[{qw1, qw2}]

Use BarSpacing -> {-.5, 1}
in both charts to get:

Original answer:
You can use the function modifiedrange
from this answer to rescale the second data set and use Charting`FindTicks
to relabel the ticks on the right frame:
ClearAll[modifiedrange]
modifiedrange[{{a_, b_}, {c_, d_}}, z_: 0] /; z <= d := {(a d - (a - b + d) z)/(b - z), d}
{data1, data2} = Transpose[qq[[All, {2, 3}]]] ;
data2b = Rescale[data2, modifiedrange[MinMax /@ {data1, data2}], MinMax @ data1];
tickF = Charting`FindTicks[MinMax@data1, modifiedrange[MinMax /@ {data1, data2}]];
BarChart[Transpose[{data1, data2b}],
ChartStyle -> (Darker /@ {Red, Blue}),
BarSpacing -> {0, 1},
ImageSize -> 500,
Axes -> {True, False},
Frame -> {Left, Right},
FrameStyle -> { Darker /@ {Red, Blue}, {Automatic, Automatic}},
FrameTicks -> {{Automatic, tickF}, {Automatic, Automatic}}]

Use BarSpacing -> {-.5, 1}
to get
