如何在SQL Server中从多个行进行连接,然后进行分组和计数

时间:2019-05-17 11:13:33

标签: sql sql-server string concatenation

我正试图从中得到

tPeople
名称
 爱丽丝
 鲍勃

tAnimals
名字动物
 爱丽丝猫
 爱丽丝猫
 鲍勃·马
 鲍勃·狗

对此

Alice“ Cat * 2”
鲍勃·“马,狗”

到目前为止,我有一个对动物进行分组和计数的中间表

tGrouped 名字动物记号
爱丽丝猫2
鲍勃狗1
鲍勃·马1

如果我跑步

SELECT Name, Animals=STUFF((
    SELECT N', '+animal+'*'+tally FROM tgrouped as g
    WHERE g.Name = p.Name
    FOR XML PATH(''), TYPE).value(N'.[1]', N'varchar(max)'), 1, 2, N'')
FROM tpeople as p

我明白了
动物名字
爱丽丝猫* 2
鲍伯狗* 1,马* 1

有什么办法可以跳过中间表?还有什么方法不显示计数结果为1?

2 个答案:

答案 0 :(得分:1)

您不需要中间表。您可以只在查询中进行计算。对于第二个,您可以调整逻辑:

WITH grouped as (
      SELECT a.name, a.animal, COUNT(*) as cnt
      FROM tAnimals a
      GROUP BY a.name, a.animal
     )
SELECT Name,
       STUFF((SELECT (CASE WHEN cnt = 1 THEN N', ' + animal
                           ELSE CONCAT(N', ', animal, '*',  cnt)
                      END)
              FROM grouped g
              WHERE p.Name = g.Name
              FOR XML PATH(''), TYPE
             ).value(N'.[1]', N'varchar(max)'
                    ), 1, 2, N''
            ) as animals
FROM tpeople p;

答案 1 :(得分:0)

与戈登类似的方法,但没有CTE:

 t)
      File "/usr/lib/python2.6/site-packages/openerp-7.0_20130301_002301-py2.6.egg/openerp/tools/convert.py", line 954, in convert_xml_import
        obj.parse(doc.getroot())
      File "/usr/lib/python2.6/site-packages/openerp-7.0_20130301_002301-py2.6.egg/openerp/tools/convert.py", line 847, in parse
        self._tags[rec.tag](self.cr, rec, n)
      File "/usr/lib/python2.6/site-packages/openerp-7.0_20130301_002301-py2.6.egg/openerp/tools/convert.py", line 814, in _tag_record
        id = self.pool.get('ir.model.data')._update(cr, self.uid, rec_model, self.module, res, rec_id or False, not self.isnoupdate(data_node), noupdate=self.isnoupdate(data_node), mode=self.mode, context=rec_context )
      File "/usr/lib/python2.6/site-packages/openerp-7.0_20130301_002301-py2.6.egg/openerp/addons/base/ir/ir_model.py", line 960, in _update
        res_id = model_obj.create(cr, uid, values, context=context)
      File "/usr/lib/python2.6/site-packages/openerp-7.0_20130301_002301-py2.6.egg/openerp/addons/base/ir/ir_ui_view.py", line 102, in create
        return super(osv.osv, self).create(cr, uid, values, context)
      File "/usr/lib/python2.6/site-packages/openerp-7.0_20130301_002301-py2.6.egg/openerp/osv/orm.py", line 4471, in create
        self._validate(cr, user, [id_new], context)
      File "/usr/lib/python2.6/site-packages/openerp-7.0_20130301_002301-py2.6.egg/openerp/osv/orm.py", line 1544, in _validate
        raise except_orm('ValidateError', '\n'.join(error_msgs))
    except_orm: ('ValidateError', u'Error occurred while validating the field(s) arch: Invalid XML for View Architecture!')