我有一个像这样的表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
请帮助我实现这一目标。
答案 0 :(得分:2)
您可以在BilNo上group by
使用与for xml
的子查询来连接Rate
,Weight
和Type
。
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