Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: слияние нескольких строк в одну  [new]
seeerg_23
Member

Откуда:
Сообщений: 1102
сделаем даже проще. выборака по 2м полям, но из разных таблиц

SELECT IDSTINCT dbo.PC.Name, dbo.DISK.Model
FROM dbo.PC.ResourceID INNER JOIN
dbo.DISK ON dbo.PC.ResourceID = dbo.DISK.ResourceID

PC HDD
------------------
соня WD
ольга Samsung
коля Hitachi
таня Seagate
таня Seagate
таня Seagate

а должно вот так быть в результате


PC HDD
--------------------
соня WD
ольга Samsung
коля Hitachi
таня Seagate, Seagate, Seagate

SELECT dbo.PC.ResourceID,
(select dbo.DISK.Model0 + ',' as 'data()'
from dbo.PC INNER JOIN dbo.DISK
ON dbo.PC.ResourceID = dbo.DISK.ResourceID
where T1.[?]=T2.[?] for xml path(''))

FROM dbo.PC INNER JOIN dbo.DISK ON dbo.PC.ResourceID = dbo.DISK.ResourceID

что указать в where ? поля из одной табл или из разных??
30 июл 12, 12:55    [12934038]     Ответить | Цитировать Сообщить модератору
 Re: слияние нескольких строк в одну  [new]
seeerg_23
Member

Откуда:
Сообщений: 1102
user89
seeerg_23,

На таких данных
PCtBIOStHDDtHDD_SizetCPUtSockettMemory_TypetMemory_Size
sonyatdefaulttsamsungt100 GbtIntelt775tDIMM1t1024
olgatPhoenixtWDt120 GbtIntelt775tDIMM1t2048
kolyatdefaulttseagatet250 GbtIntelt775tDIMM1t1024
tanyatAMDtSeagatet300 GbtAMDt939tDIMM1t3072
tanyatAMDtSeagatet350 GbtAMDt939tDIMM1t1024
tanyatAMDtSeagatet400 GbtAMDt939tDIMM1t2048

+
+ можно так
set nocount on

declare @t table (PC varchar(50), BIOS varchar(50), HDD varchar(50), HDD_Size varchar(50), CPU varchar(50), Socket int, Memory_Type varchar(50), Memory_Size int)
insert @t
  select 'sonya', 'default', 'samsung', '100 Gb', 'Intel', 775, 'DIMM1', 1024 union all
  select 'olga', 'Phoenix', 'WD', '120 Gb', 'Intel', 775, 'DIMM1', 2048 union all
  select 'kolya', 'default', 'seagate', '250 Gb', 'Intel', 775, 'DIMM1', 1024 union all
  select 'tanya', 'AMD', 'Seagate', '300 Gb', 'AMD', 939, 'DIMM1', 3072 union all
  select 'tanya', 'AMD', 'Seagate', '350 Gb', 'AMD', 939, 'DIMM1', 1024 union all
  select 'tanya', 'AMD', 'Seagate', '400 Gb', 'AMD', 939, 'DIMM1', 2048

if object_id('tempdb..#res') is not null drop table #res
select * into #res from @t
select * from #res

select pc, bios,
substring((
  select ', '+ t2.hdd +' '+ t2.hdd_size from #res t2 where t2.pc = t1.pc and t2.bios = t1.bios for xml path('')),
2, 2000000000) [hdd],
cpu, socket, substring((
  select ', '+ t2.Memory_Type +' '+ cast(t2.Memory_Size as varchar(50)) from #res t2
  where t2.pc = t1.pc and t2.cpu = t1.cpu and t2.socket = t1.socket for xml path('')),
2, 2000000000) [mem]
from #res t1
group by pc, bios, cpu, socket

if object_id('tempdb..#res') is not null drop table #res

Результат
pctbiosthddtcputsockettmem
kolyatdefaultt seagate 250 GbtIntelt775t DIMM1 1024
olgatPhoenixt WD 120 GbtIntelt775t DIMM1 2048
sonyatdefaultt samsung 100 GbtIntelt775t DIMM1 1024
tanyatAMDt Seagate 300 Gb, Seagate 350 Gb, Seagate 400 GbtAMDt939t DIMM1 3072, DIMM1 1024, DIMM1 2048


insert @t
select 'sonya', 'default', 'samsung', '100 Gb', 'Intel', 775, 'DIMM1', 1024 union all
select 'olga', 'Phoenix', 'WD', '120 Gb', 'Intel', 775, 'DIMM1', 2048 union all
и тд. это мне по каждой строке надо будет вручную делать??
30 июл 12, 13:00    [12934089]     Ответить | Цитировать Сообщить модератору
 Re: слияние нескольких строк в одну  [new]
Glory
Member

Откуда:
Сообщений: 104760
seeerg_23
что указать в where ? поля из одной табл или из разных??

Мда уж

SELECT T1.ResourceID,
(select dbo.DISK.Model0 + ',' as 'data()'
from dbo.DISK T2
where T2.ResourceID=T1.ResourceID for xml path(''))
FROM dbo.PC T1


seeerg_23
и тд. это мне по каждой строке надо будет вручную делать??

Это пример заполнения таблицы тестовыми данными.
30 июл 12, 13:15    [12934238]     Ответить | Цитировать Сообщить модератору
 Re: слияние нескольких строк в одну  [new]
seeerg_23
Member

Откуда:
Сообщений: 1102
8985
Glory
seeerg_23
что указать в where ? поля из одной табл или из разных??

Мда уж

SELECT T1.ResourceID,
(select dbo.DISK.Model0 + ',' as 'data()'
from dbo.DISK T2
where T2.ResourceID=T1.ResourceID for xml path(''))
FROM dbo.PC T1


seeerg_23
и тд. это мне по каждой строке надо будет вручную делать??

Это пример заполнения таблицы тестовыми данными.


плз, для этого запроса, тк у меня 2е табл учавствует
SELECT dbo.PC.ResourceID,
(select dbo.DISK.Model0 + ',' as 'data()'
from dbo.PC INNER JOIN dbo.DISK
ON dbo.PC.ResourceID = dbo.DISK.ResourceID
where T1.[?]=T2.[?] for xml path(''))

FROM dbo.PC INNER JOIN dbo.DISK ON dbo.PC.ResourceID = dbo.DISK.ResourceID
30 июл 12, 14:20    [12934787]     Ответить | Цитировать Сообщить модератору
 Re: слияние нескольких строк в одну  [new]
Glory
Member

Откуда:
Сообщений: 104760
seeerg_23
плз, для этого запроса, тк у меня 2е табл учавствует

Да не нужно там две таблицы в подзапросе. Как вы не поймете простые вещи ?
30 июл 12, 14:37    [12934929]     Ответить | Цитировать Сообщить модератору
 Re: слияние нескольких строк в одну  [new]
seeerg_23
Member

Откуда:
Сообщений: 1102
в вашем примере
.......
substring((
select ', '+ t2.hdd +' '+ t2.hdd_size from #res t2 where t2.pc = t1.pc and t2.bios = t1.bios for xml path('')), и тд
........
как быть, если в таблицах некоторые поля называются одинаково?? я пример данных писал уже как должно быть в результате.
в таблице имя выбираемго поля называется Name. те не PC, BIOS, HDD, а dbo.pc.name, dbo.bios.name, dbo.hdd.name
те в запросе и подзапросе как теперь писать t2.dbo.hdd.name +' ' t2.hdd_size from #res t2 where t2.dbo.pc.name=t1.dbo.pc.name and t2.bios.name = t1.bios.name for xml path(''))

так ??
30 июл 12, 17:04    [12936036]     Ответить | Цитировать Сообщить модератору
 Re: слияние нескольких строк в одну  [new]
Glory
Member

Откуда:
Сообщений: 104760
seeerg_23
те в запросе и подзапросе как теперь писать t2.dbo.hdd.name +' ' t2.hdd_size from #res t2 where t2.dbo.pc.name=t1.dbo.pc.name and t2.bios.name = t1.bios.name for xml path(''))

так ??

Нет
Alias.Field - вот так
30 июл 12, 17:07    [12936061]     Ответить | Цитировать Сообщить модератору
 Re: слияние нескольких строк в одну  [new]
seeerg_23
Member

Откуда:
Сообщений: 1102
Glory,

конкретнее, плз. то без dbo писать t2.dbo.hdd.name +' ' t2.hdd_size ? или как ??
30 июл 12, 17:37    [12936256]     Ответить | Цитировать Сообщить модератору
 Re: слияние нескольких строк в одну  [new]
seeerg_23
Member

Откуда:
Сообщений: 1102
вот так не работает.
SELECT PC.Name0, BIOS.Name0 AS BIOS, DISK.Model0 AS HDD, DISK.Size0
into #res
FROM PC INNER JOIN
BIOS ON PC.ResourceID = BIOS.ResourceID INNER JOIN
DISK ON BIOS.ResourceID = DISK.ResourceID
select * from #res
select PC.Name0, BIOS.Name0,
substring((
select ', '+ t2.DISK.Model0 +' '+ t2.DISK.Size0
from #res t2
where t2.PC.Name0 = t1.PC.Name0
and t2.BIOS.Name0 = t1.PC_BIOS.Name0 for xml path('')),2, 2000000000)

from #res t1

Помогите, плз. чувствую плизка победа.
30 июл 12, 17:47    [12936312]     Ответить | Цитировать Сообщить модератору
 Re: слияние нескольких строк в одну  [new]
user89
Member

Откуда:
Сообщений: 2083
seeerg_23,

ужас! Срочно изучать основы T-SQL !!!

Пока могу предположить это
select t1.Name0, t1.Bios,
substring((
  select ', '+ t2.Model0 +' '+ t2.Size0 
  from #res t2 
  where t2.Name0 = t1.Name0 for xml path('')),2, 2000000000) [hdd]
from #res t1
30 июл 12, 17:59    [12936412]     Ответить | Цитировать Сообщить модератору
 Re: слияние нескольких строк в одну  [new]
seeerg_23
Member

Откуда:
Сообщений: 1102
user89
seeerg_23,

ужас! Срочно изучать основы T-SQL !!!

Пока могу предположить это
select t1.Name0, t1.Bios,
substring((
  select ', '+ t2.Model0 +' '+ t2.Size0 
  from #res t2 
  where t2.Name0 = t1.Name0 for xml path('')),2, 2000000000) [hdd]
from #res t1


и не работает так.

а вот так работает, но для 2х табл. я не знаю как добавить в запрос выборку из 5 полей из 5 табл.

SELECT T1.ResourceID, T1.Name0,
(select Model0 + ',' as 'data()'
from dbo.DISK T2
where T2.ResourceID=T1.ResourceID for xml path ('') )
FROM dbo.PC T1

вот общий запрос

SELECT PC.Name0, BIOS.Name0 AS BIOS, DISK.Model0 AS HDD, DISK.Size0
FROM PC INNER JOIN
BIOS ON PC.ResourceID = BIOS.ResourceID INNER JOIN
DISK ON BIOS.ResourceID = DISK.ResourceID
31 июл 12, 09:28    [12938405]     Ответить | Цитировать Сообщить модератору
 Re: слияние нескольких строк в одну  [new]
seeerg_23
Member

Откуда:
Сообщений: 1102
seeerg_23
user89
seeerg_23,

На таких данных
PCtBIOStHDDtHDD_SizetCPUtSockettMemory_TypetMemory_Size
sonyatdefaulttsamsungt100 GbtIntelt775tDIMM1t1024
olgatPhoenixtWDt120 GbtIntelt775tDIMM1t2048
kolyatdefaulttseagatet250 GbtIntelt775tDIMM1t1024
tanyatAMDtSeagatet300 GbtAMDt939tDIMM1t3072
tanyatAMDtSeagatet350 GbtAMDt939tDIMM1t1024
tanyatAMDtSeagatet400 GbtAMDt939tDIMM1t2048

++
+ можно так
set nocount on

declare @t table (PC varchar(50), BIOS varchar(50), HDD varchar(50), HDD_Size varchar(50), CPU varchar(50), Socket int, Memory_Type varchar(50), Memory_Size int)
insert @t
  select 'sonya', 'default', 'samsung', '100 Gb', 'Intel', 775, 'DIMM1', 1024 union all
  select 'olga', 'Phoenix', 'WD', '120 Gb', 'Intel', 775, 'DIMM1', 2048 union all
  select 'kolya', 'default', 'seagate', '250 Gb', 'Intel', 775, 'DIMM1', 1024 union all
  select 'tanya', 'AMD', 'Seagate', '300 Gb', 'AMD', 939, 'DIMM1', 3072 union all
  select 'tanya', 'AMD', 'Seagate', '350 Gb', 'AMD', 939, 'DIMM1', 1024 union all
  select 'tanya', 'AMD', 'Seagate', '400 Gb', 'AMD', 939, 'DIMM1', 2048

if object_id('tempdb..#res') is not null drop table #res
select * into #res from @t
select * from #res

select pc, bios,
substring((
  select ', '+ t2.hdd +' '+ t2.hdd_size from #res t2 where t2.pc = t1.pc and t2.bios = t1.bios for xml path('')),
2, 2000000000) [hdd],
cpu, socket, substring((
  select ', '+ t2.Memory_Type +' '+ cast(t2.Memory_Size as varchar(50)) from #res t2
  where t2.pc = t1.pc and t2.cpu = t1.cpu and t2.socket = t1.socket for xml path('')),
2, 2000000000) [mem]
from #res t1
group by pc, bios, cpu, socket

if object_id('tempdb..#res') is not null drop table #res

Результат
pctbiosthddtcputsockettmem
kolyatdefaultt seagate 250 GbtIntelt775t DIMM1 1024
olgatPhoenixt WD 120 GbtIntelt775t DIMM1 2048
sonyatdefaultt samsung 100 GbtIntelt775t DIMM1 1024
tanyatAMDt Seagate 300 Gb, Seagate 350 Gb, Seagate 400 GbtAMDt939t DIMM1 3072, DIMM1 1024, DIMM1 2048


insert @t
select 'sonya', 'default', 'samsung', '100 Gb', 'Intel', 775, 'DIMM1', 1024 union all
select 'olga', 'Phoenix', 'WD', '120 Gb', 'Intel', 775, 'DIMM1', 2048 union all
и тд. это мне по каждой строке надо будет вручную делать??


кстати, ваш пример не работает. данные перечисляются в строках, а не в одной строке
31 июл 12, 09:46    [12938495]     Ответить | Цитировать Сообщить модератору
 Re: слияние нескольких строк в одну  [new]
seeerg_23
Member

Откуда:
Сообщений: 1102
есть рабочий запрос для 3х полей из 2х табл
SELECT T1.ResourceID, T1.Name0,
(select Model0 + ',' as 'data()'
from dbo.v_GS_DISK T2
where T2.ResourceID=T1.ResourceID for xml path ('') ) as HDD,
FROM dbo.PC T1

помогите, плз, с этим запросом для 6ти полей из 3х табл

SELECT PC.ResourceID, PC.Name0 as PC, BIOS.Name0 AS BIOS, DISK.Model0 AS HDD, DISK.Size0
FROM PC INNER JOIN
BIOS ON PC.ResourceID = BIOS.ResourceID INNER JOIN
DISK ON BIOS.ResourceID = DISK.ResourceID
31 июл 12, 10:14    [12938622]     Ответить | Цитировать Сообщить модератору
 Re: слияние нескольких строк в одну  [new]
Glory
Member

Откуда:
Сообщений: 104760
seeerg_23
помогите, плз, с этим запросом для 6ти полей из 3х табл

SELECT PC.ResourceID, PC.Name0 as PC, BIOS.Name0 AS BIOS, DISK.Model0 AS HDD, DISK.Size0
FROM PC INNER JOIN
BIOS ON PC.ResourceID = BIOS.ResourceID INNER JOIN
DISK ON BIOS.ResourceID = DISK.ResourceID

Как же с вами трудно.

SELECT T1.ResourceID, T1.Name0,
(select T2.Model0 + ',' as 'data()' from dbo.DISK T2 where T2.ResourceID=T1.ResourceID for xml path ('') ) as HDD,
(select T3.Name0 + ',' as 'data()' from dbo.BIOS T3 where T3.ResourceID=T1.ResourceID for xml path ('') ) as BIOS,
FROM dbo.PC T1
31 июл 12, 10:37    [12938783]     Ответить | Цитировать Сообщить модератору
 Re: слияние нескольких строк в одну  [new]
seeerg_23
Member

Откуда:
Сообщений: 1102
капец, РАБОТАЕТ, СПАСИБО, СПАСИБО.
31 июл 12, 10:57    [12938938]     Ответить | Цитировать Сообщить модератору
 Re: слияние нескольких строк в одну  [new]
seeerg_23
Member

Откуда:
Сообщений: 1102
и последний вопрос. нужно сделать конкатенацию столбцов HDD+SIZE (пока это 2 столбца), те Maxtor и 1024 Gb, надо сделать Maxtor, 1024Gb
подзапрос
(select T2.Model0 + ',' as 'data()' from dbo.DISK T2 where T2.ResourceID=T1.ResourceID for xml path ('') ) as HDD,
пишу
(select T2.Model0 + ',' as 'data()' from dbo.DISK T2 where T2.ResourceID=T1.ResourceID for xml path (''), Size0) as HDD,
или
(select T2.Model0 + ',' as 'data()' from dbo.DISK T2 where T2.ResourceID=T1.ResourceID for xml path ('') ) as HDD, Size0

выдаёт ситаксич ошибку. как правильно сделать?
31 июл 12, 11:49    [12939393]     Ответить | Цитировать Сообщить модератору
 Re: слияние нескольких строк в одну  [new]
Glory
Member

Откуда:
Сообщений: 104760
Конкатенация символьных строк делается опертором +, а не простым перечислением полей в произвольных местах запроса.
31 июл 12, 11:52    [12939410]     Ответить | Цитировать Сообщить модератору
 Re: слияние нескольких строк в одну  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
seeerg_23,

SELECT T.ResourceID
,[HDD]='HDD: '
+STUFF((SELECT ','+D.Model0 FROM dbo.DISK D WHERE D.ResourceID=T.ResourceID FOR XML PATH(''),TYPE),value('.','VARCHAR(MAX)'),1,1,'')
+'; Size='+CAST(T.Size0 AS VARHAR(MAX))
FROM dbo.PC T
GROUP BY T.ResourceID;
Как-то так что ли?
31 июл 12, 12:08    [12939539]     Ответить | Цитировать Сообщить модератору
 Re: слияние нескольких строк в одну  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
SELECT T.ResourceID
,[HDD]='HDD: '
+STUFF((SELECT ','+D.Model0 FROM dbo.DISK D WHERE D.ResourceID=T.ResourceID FOR XML PATH(''),TYPE),value('.','VARCHAR(MAX)'),1,1,'')
+'; Size='+CAST(T.Size0 AS VARСHAR(MAX))
FROM dbo.PC T
GROUP BY T.ResourceID;
31 июл 12, 12:09    [12939546]     Ответить | Цитировать Сообщить модератору
 Re: слияние нескольких строк в одну  [new]
seeerg_23
Member

Откуда:
Сообщений: 1102
+Size0 as varchar(10)
(select T2.Model0 + ',' as 'data()' from dbo.DISK T2 where T2.ResourceID=T1.ResourceID for xml path ('')+Size0 as varchar(10)) as HDD,
или
(select T2.Model0 + ',' as 'data()' from dbo.DISK T2 where T2.ResourceID=T1.ResourceID for xml path ('') ) as HDD+Size0 as varchar(10)
или
(select T2.Model0 + ',' as 'data()' +Size0 as varchar(10) from dbo.DISK T2 where T2.ResourceID=T1.ResourceID for xml path ('') )

так не работает.
31 июл 12, 12:14    [12939582]     Ответить | Цитировать Сообщить модератору
 Re: слияние нескольких строк в одну  [new]
Glory
Member

Откуда:
Сообщений: 104760
seeerg_23
так не работает.

Вы синтаксис всегда сами придумываете ?
Size0 as varchar(10) вы откуда взяли ?
31 июл 12, 12:16    [12939598]     Ответить | Цитировать Сообщить модератору
 Re: слияние нескольких строк в одну  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
seeerg_23
+Size0 as varchar(10)
(select T2.Model0 + ',' as 'data()' from dbo.DISK T2 where T2.ResourceID=T1.ResourceID for xml path ('')+Size0 as varchar(10)) as HDD,
или
(select T2.Model0 + ',' as 'data()' from dbo.DISK T2 where T2.ResourceID=T1.ResourceID for xml path ('') ) as HDD+Size0 as varchar(10)
или
(select T2.Model0 + ',' as 'data()' +Size0 as varchar(10) from dbo.DISK T2 where T2.ResourceID=T1.ResourceID for xml path ('') )

так не работает.
Для каждого Model0 надо Size0 написать?
Парами?
SELECT T.ResourceID
,[HDD]=STUFF((SELECT ','+D.Model0+' '+CAST(D.Size0 AS VARСHAR(MAX)) FROM dbo.DISK D WHERE D.ResourceID=T.ResourceID FOR XML PATH(''),TYPE),value('.','VARCHAR(MAX)'),1,1,'')
FROM dbo.PC T
GROUP BY T.ResourceID;
31 июл 12, 12:19    [12939616]     Ответить | Цитировать Сообщить модератору
 Re: слияние нескольких строк в одну  [new]
seeerg_23
Member

Откуда:
Сообщений: 1102
теперь другая проблема. сделали конкатенацию и слияние нескольких строк в одну. есть поле МАК-адрес. почему-то на разных ПК повторяется один и тот же МАК-адрес.... пример. 5 ПК имеют почему-то все по 2 МАК-адреса (обычные ПК, не сервера), у 4х из них по одному МАКу совпадают, те 5 ПК - 10 МАК адресов, 4 -совпадают. вообще не пойму как такое может быть. использовал DISTINCT - не помогает.

SELECT distinct T1.Name AS [PC Name],
(SELECT T2.Name0 AS 'data()'
FROM dbo.BIOS T2
WHERE T2.ResourceID = T1.ResourceID FOR xml path('')) AS BIOS,
................................

(SELECT distinct T10.MAC + ';' + ' ' AS 'data()'
FROM dbo.NET T10
WHERE T10.ResourceID = T1.ResourceID FOR xml path('')) AS MAC
FROM dbo.PC T1

подскажите, что предпринять можно?
10 авг 12, 15:44    [12994625]     Ответить | Цитировать Сообщить модератору
 Re: слияние нескольких строк в одну  [new]
Glory
Member

Откуда:
Сообщений: 104760
seeerg_23
вообще не пойму как такое может быть

Такие данные занесены в ваши таблицы значит.

seeerg_23
использовал DISTINCT - не помогает.

DISTINCT данные не исправит
10 авг 12, 15:49    [12994653]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Microsoft SQL Server Ответить