-1

2つの列を持つテーブルがあります:client_idinvoice_id。すべてに対して、client id複数の請求書IDが存在する可能性があります。前述のテーブルの行を列に変換するMySQLクエリを探しています。クライアントごとに最初の2つの請求書だけが必要です。以下の擬似コードのようなもの:

SELECT ci.client_id, 
  first(ci.invoice_id) AS invoice_column1, 
  second(ci.invoice_id) AS invoice_column2
FROM client_invoices ci
GROUP BY ci.client_id

client_invoicesのサンプルデータ

client_id | invoice_id 
1           45
2           56
1           88

サンプル出力

client_id | invoice_column1 | invoice_column2
1           45                88
2           56                NULL
4

3 に答える 3

1

クライアントごとに複数のエントリを持つ単一のテーブルがあるとすると、予想されるクエリは次のようになります。

SELECT
    ci.client_id,
    GROUP_CONCAT(ci.invoice_id) as InvoiceIds
FROM(
    SELECT
        client_id,
        invoice_id,
        @num := if(@group = client_id, @num + 1, 1) as row_number,
        @group := client_id as dummy                
    FROM    client_invoices
    GROUP BY client_id , invoice_id
    HAVING row_number <= 2  
) as ci
GROUP BY ci.client_id 

デモ

于 2013-01-08T12:08:33.317 に答える
0

このようなもの?

DECLARE tmp int(11);
DECLARE tmp2 int(11);
SELECT invoice_id INTO tmp FROM ci LIMIT 1,1;
SELECT invoice_id INTO tmp2 FROM ci LIMIT 2,1;
SELECT ci.client_id, 
 tmp AS invoice_column1, 
 tmp2 AS invoice_column2
 FROM client_invoices ci
 GROUP BY ci.client_id
于 2013-01-08T12:12:26.377 に答える
0

以下を使用して、グループごとに行番号を割り当て、データを列に変換できます。

select client_id,
  max(case when group_row_number = 1 then invoice_id end) Invoice1,
  max(case when group_row_number = 2 then invoice_id end) Invoice2
from
(
  select client_id, invoice_id,
    @num := if(@client_id = `client_id`, @num + 1, 1) as group_row_number,
    @client_id := `client_id` as dummy, overall_row_num
  from
  (
    select client_id, invoice_id, @rn:=@rn+1 overall_row_num
    from client_invoices, (SELECT @rn:=0) r
  ) x
  order by client_id, overall_row_num
) src
group by client_id

SQL FiddlewithDemoを参照してください

またはそれを行うためのより簡単な方法:

select client_id, 
  max(case when rownum = 1 then invoice_id end) Invoice1,
  max(case when rownum = 2 then invoice_id end) Invoice2 
from 
(
  select client_id,
    invoice_id,
    @row:=if(@prev=client_id,@row,0) + 1 as rownum,
    @prev:=client_id 
  from client_invoices
  order by client_id
)src
group by client_id;

SQL FiddlewithDemoを参照してください

どちらも結果を生成します。

| CLIENT_ID | INVOICE1 | INVOICE2 |
-----------------------------------
|         1 |       45 |       88 |
|         2 |       56 |   (null) |
于 2013-01-08T13:36:41.753 に答える