2016-09-19 4 views
-2

У меня есть требование в базе данных SQL Server, где мне нужно сгруппировать данные. пожалуйста, прикрепите изображение для справки.Номера групп на основе уровня

Если уровень более 2, то он должен быть сгруппирован под уровнем 2 (например: 1.1.1, 1.1.2 свертываются под 1.1.), И если не существует ни одного уровня 2, создать второй уровень, основанный на уровне 3-х номеров (например: 1.2.1)

Благодарности

+0

Вы хотите добавить дополнительный столбец в соответствии с вашим снимком экрана, хотите ли вы группировать данные и делать скопления на нем или просто хотите заказать данные при выводе? – iamdave

+0

всегда есть '.' В конце номера группы для уровня 2 или выше? Потому что 1.2.1 его нет. – Nebi

+0

вставьте данные как текст – TheGameiswar

ответ

0

Если не уверены, что первые 2 цифры являются однозначными числами:

declare @T table ([Column] varchar(20)); 

insert into @T values ('1'),('1.2.'),('1.2.3.'),('1.2.3.4.'),('10.20.'),('10.20.30.'),('10.20.30.40.'); 

select 
case when [Column] like '%.%.%' then substring([Column],1,charindex('.',[Column],charindex('.',[Column])+1)) else [Column] end as [Derived Col1], 
case when [Column] like '%.%.%.%' then [Column] else '' end as [Derived Col2] 
from @T; 

Если это уверен, что первые 2 цифры являются однозначными числами, то она может быть упрощена:

declare @T table ([Column] varchar(20)); 

insert into @T values ('1'),('1.2.'),('1.2.3.'),('1.2.3.4.'); 

select 
substring([Column],1,4) as [Derived Col1], 
case when [Column] like '%.%.%.%' then [Column] else '' end as [Derived Col2] 
from @T; 
0

ли это делать, если вам нужны новые значения, вычисляемых столбцов?
Обновлено: это работает с двузначными цифрами, а третий столбец является нулевым для версии первого/второго уровня

CREATE TABLE Test 
(
    Version varchar(30), 
    VersionMain AS CASE 
     WHEN CHARINDEX('.',Version,4) > 0 THEN LEFT(Version,CHARINDEX('.',Version,4)) ELSE Version END, 
    VersionSub AS CASE 
     WHEN LEN(Version) - LEN(REPLACE(Version,'.','')) >= 3 THEN Version ELSE NULL END 
) 
+0

Есть ли у нас динамический способ получения числа, используемого в функции LEFT. –

+0

Левая часть немного сложна, но на самом деле вам нужно реализовать такую ​​же логику и в подвале (когда номера версий пройдут через 9). Подчасти легко использовать логику case WHEN LEN (Version) - REPLACE (Версия, '.', '')> = 3 – JayValkyr

0

вы можете использовать CHARINDEX для поиска «» а затем выберите DERIVED_COL_2.

SELECT COLUMN, 
SUBSTRING(COLUMN,1,4)DERIVED_COL_1, 
CASE WHEN CHARINDEX('.',COLUMN,5) = 6 THEN COLUMN END AS DERIVED_COL_2 
FROM YOUR_TABLE 
Смежные вопросы