Parsing Python arguments
You do not have to check len(sys.argv) yourself. A properly constructed ArgumentParser will sort that out by itself.
Likewise, you do not need to pass sys.argv[1:] to parse_args(), argparse will figure it out.
default=None and required=False are default values for an optional argument (those starting with '-'), you do not need to supply them.
You do not need to use a lambda to specify the function to call, just pass in the name of the function: it will simplify handling this parameters.
You can add do_work as a default value for '-a': no more TypeError as the content of parsed_args.cmd will alway be a callable.
There is no need in using a mutually exclusive group if you only ever put one option in it: remove it.
You should use if __name__ == '__main__': and put your top-level code under it.
In do_*work you should test database using is None or is not None.




def do_work(database=None):
    if database is not None:
        print 'Doing work for {0}'.format(database)
    else:
        print 'Doing work all database'

def do_other_work(database=None):
    if database is not None:
        print 'Doing other work for {0}'.format(database)
    else:
        print 'Doing other work all database'

def create_parser():
    parser = ArgumentParser(description='Parser')
    parser.add_argument('--db', '-d', dest='database', help='Database name')
    parser.add_argument('-a', dest='cmd', action='store_const',
                        const=do_other_work, default=do_work)
    return parser


if __name__ == '__main__':
    parsed_args = create_parser().parse_args()
    parserd_args.cmd(parsed_args.database)