2015-06-09 3 views
0

Мне нужно перечислять данные подсчета и базируемые значения «rate», соединяющие две таблицы.Как сгенерировать идентификатор на основе результата соединения результата

Оценить Таблица

id rate ratevale 
-------------------------  
    1  N  NA  
    2  D  DH  
    3  F  FA  
    4  L  LD 

претензии Таблица

id rate 

1 N 

2 N 

3 N 

4 F 

5 N 

6 D 

7 D 

8 F 

9 L 

мне нужно перечислить результат следующий как тот

id Generate 

1 NA-40-001 

2 NA-40-002 

3 NA-40-003 

4 FA-40-001 

5 NA-40-004 

6 DH-40-001 

7 DH-40-002 

8 FA-40-002 

9 LD-40-001 

Я работал запрос следующим

$query="select count(Claim.rate) as count,Rate.ratevale from Claim leftjoin Rate on Claim.rate=Rate.rate group by Claim.rate"; 

Его отображение количества каждого «скорости и ratevalue» как следующий

NA->4 

FA->2 

DH->2 

LD->1 

Но мне нужно как перечислить данные выше формата.

+0

Каковы значения '40' и' 00x' в столбце «Создать»? – Chris

+0

40 является статическим значением и 00x идентификатор необходимо сгенерировать – user2725587

ответ

0

Попробуйте этот код:

$query="SELECT COUNT(Claim.rate) AS count, Rate.ratevale 
FROM claim 
LEFT JOIN rate ON Claim.rate = Rate.rate 
GROUP BY Claim.rate" ; 

с заказом По

$query = "SELECT COUNT(claim.rate) AS count, rate.ratevale 
FROM claim 
LEFT JOIN rate ON claim.rate = rate.rate 
GROUP BY claim.rate 
ORDER BY count DESC" ; 
+0

мне нужно, как «1 НС-40-001 2 НС-40-002 3 NA-40-003 4 FA-40-001 5 Н.А. -40-004 6 DH-40-001 7 DH-40-002 8 FA-40-002 9 LD-40-001" – user2725587

+0

См этой ссылке: [http://stackoverflow.com/вопросы/11861799/MySQL-запрос к Select-результаты-с-автоприращения-в-а-нового столбца добавленной в-г] –

0

С таблицами

CREATE TABLE ctab (id int,rate varchar(1)); -- claims table 
INSERT INTO ctab (id,rate) VALUES 
    (1, 'N'),(2, 'N'),(3, 'N'),(4, 'F'),(5, 'N'), 
    (6, 'D'),(7, 'D'),(8, 'F'),(9, 'L'); 

CREATE TABLE rtab(id int,rate varchar(1), ratevale varchar(2)); 
INSERT INTO rtab (id,rate,ratevale) VALUES -- rates table 
    (1, 'N', 'NA'),(2, 'D', 'DH'),(3, 'F', 'FA'),(4, 'L', 'LD'); 

мы можем сделать следующее:

SELECT t.id, CONCAT(ratevale,'-40-',RIGHT(CAST(i+1000 as char(4)),3)) rval 
FROM (
SELECT CASE WHEN @r =rate THEN @i:[email protected]+1 ELSE @i:= 1 END i, 
     CASE WHEN @r!=rate THEN @r:=rate ELSE @r  END r, 
id id,rate rate 
FROM (SELECT @i:=1,@r:='') v, ctab c 
ORDER BY rate,id 
) t 
INNER JOIN rtab r ON r.rate=t.rate 
ORDER BY id 

и мы получаем:

| id |  rval | 
|----|-----------| 
| 1 | NA-40-001 | 
| 2 | NA-40-002 | 
| 3 | NA-40-003 | 
| 4 | FA-40-001 | 
| 5 | NA-40-004 | 
| 6 | DH-40-001 | 
| 7 | DH-40-002 | 
| 8 | FA-40-002 | 
| 9 | LD-40-001 | 

поиграйте с ним здесь: http://sqlfiddle.com/#!9/d9e3e/15

Основная идея заключается в том, что мы перечисляем таблицу претензий, заказанный rate и превратить его в производную таблицу t.

После инициализирован @i к 1 и @r к '' в производной таблице v мы проверяем ли @r=rate и

  • если да, то мы увеличиваем @i.
  • в противном случае (ELSE) мы сбрасываем @i в 1 и @r в rate. Это происходит во втором предложении CASE.

В итоге получится столбец последовательностей i, который начинает подсчет для каждого значения rate. В внешнем заявлении SELECT производная таблица t затем соединяется с таблицей тарифов rtab и применяется другой порядок сортировки.

Обратите внимание:

Это решение также можно рассматривать в качестве альтернативного решения ROW_NUMBER() in MySQL. Вышеупомянутый запрос MySQL можно легко переписать в MSSQL, применив row_number() over (partition...), см. Здесь: http://sqlfiddle.com/#!3/d9e3e/8

Смежные вопросы