SQL用于在单个字段中对多行中的数据进行分组

时间:2011-05-04 07:33:43

标签: sql sql-server-2005

我有一个像这样的表BillData:

Column   Data Type
BilNo      INT
SlNo       INT
Rate       FLOAT
Weight     FLOAT
Type       VARCHAR(2)

有这样的样本数据:

BilNo SlNo   Rate    Weight Type
10001   1   1000.00 3.231   GM
10001   2   1200.00 2.354   GM
10001   3   1300.00 1.891   CT
10002   1   900.00  5.458   GM
10003   1   1450.00 9.520   GM
10003   2   1100.00 6.352   GM

我需要根据BilNo将重量和比率分成一个列(速率重量)并分组并提交如下报告:

Bill No Data                                              Type
10001   1000.00  3.231    1200.00 2.354    1300.00 1.891    GM GM CT
10002   900.00 4.454                                        GM
10003   1450.00 9.520    1100 6.352                         GM GM

请帮助我实现这一目标。

2 个答案:

答案 0 :(得分:2)

您可以在BilNo上group by使用与for xml的子查询来连接RateWeightType

select 
  B.BilNo as [Bill No],
  (select cast(Rate as varchar(10))+' '+cast([Weight] as varchar(10))+'  '
     from BillData as B2
     where B.BilNo = B2.BilNo
     for xml path(''), type).value('.[1]', 'varchar(max)') as Data,
  (select [Type]+' '
     from BillData as B2
     where B.BilNo = B2.BilNo
     for xml path(''), type).value('.[1]', 'varchar(max)') as [Type]
from BillData as B
group by B.BilNo

答案 1 :(得分:0)

您可以使用适用于GROUP_CONCAT命令的GROUP BY函数。

SELECT BillNo, 
 GROUP_CONCAT(Rate, ' ', Weight SEPARATOR '    ') AS DATA, 
 GROUP_CONCAT(TYPE SEPARATOR ' ') AS TYPE
FROM BillData
GROUP BY BillNo;

修改
这在MySQL 5.1.53中对我很有用。你没有指定,也许你正在使用不同的数据库引擎。这是表创建代码。你可以剪切和过去它,以及上面的sql语法:

CREATE TABLE BillData (
  BillNo int(11) DEFAULT NULL,
  SlNo int(11) DEFAULT NULL,
  Rate float DEFAULT NULL,
  Weight float DEFAULT NULL,
  Type varchar(2) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
LOCK TABLES BillData WRITE; /*!40000 ALTER TABLE BillData DISABLE KEYS /; INSERT INTO BillData (BillNo,SlNo,Rate,Weight,Type) VALUES (10001,1,1000,3.321,'GM'), (10001,2,1200,2.354,'GM'), (10001,3,1300,1.891,'CT'), (10002,1,900,5.458,'GM'), (10003,1,1450,9.52,'GM'), (10003,2,1100,6.352,'GM');
/
!40000 ALTER TABLE BillData ENABLE KEYS */; UNLOCK TABLES;

我从查询中得到了这些结果:

BillData