SQL для группировки данных в несколько строк в одном поле - PullRequest
0 голосов
/ 04 мая 2011

У меня есть таблица 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 ]

2 голосов
/ 04 мая 2011

Вы можете group by в BilNo и использовать подзапрос с 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
0 голосов
/ 04 мая 2011

Вы можете использовать функцию 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 выше: <pre> CREATE TABLE <code>BillData (BillNo int (11) DEFAULT NULL, SlNo int (11) DEFAULT NULL, Rate float DEFAULT NULL, Weight floatDEFAULT NULL, Type varchar (2) DEFAULT NULL) ENGINE = MyISAM CHARSET DEFAULT = utf8;
ЗАМКИ СТОЛОВ BillData НАПИСАТЬ;/ *! 40000 ALTER TABLE BillData ОТКЛЮЧЕННЫЕ КЛАВИШИ /;INSERT INTO BillData (BillNo, SlNo, Rate, Weight, Type) ЗНАЧЕНИЯ (10001,1000,3.321, «GM»), (10001,2,1200,2.354,«GM»), (10001,3,1300,1.891, «CT»), (10002,1,900,5458, «GM»), (10003,1,1450,9.52, «GM»), (10003,2,1100,6.352, «GM»);
/
! 40000 ALTER TABLE BillData ENABLE KEYS * /;РАЗБЛОКИРОВАТЬ СТОЛЫ;

И я получаю эти результаты из запроса:


10001   1000    3.321   1200 2.354    1300  1.891   GM GM CT
10002   900 5.458                                   GM
10003   1450    9.52    1100 6.352                  GM GM
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...