Вниз
Скачать: CL | DM;

MSSQL. Два столбца в одну строку.   Найти похожие ветки 

 
12 ©   (2010-10-08 14:35) [0]

Есть таблица, пусть T1
T1.ID int
T1.Name char(10)

и есть таблица, пусть T2
T2.ID int
T2.С1 char(10)
T2.С2 char(10)

T1.ID связан с T2.ID

известно, что
select count(*)
from T1 join T2 on T1.ID=T2.ID
where T1.ID = :ANY_VALUE
не может быть больше 5.

Как получить
T1.ID, T1.Name, T2.С1, T2.С2, T2.С1, T2.С2, T2.С1, T2.С2, T2.С1, T2.С2, T2.С1, T2.С2

не в строчку, аля
SELECT
  @Result = @Result + Convert(char(19),[DateTime],121) + Cast(CallResult as char(3))
From
  [10.171.1.5].[icm1_hds].[dbo].[t_Dialer_Detail]
WHERE
  DialingListID = @id

а именно, чтоб были столбцы


 
stas ©   (2010-10-08 14:42) [1]

если столбцы статичны, то:
case + group by


 
stas ©   (2010-10-08 14:45) [2]

если нет, то тоже самое только строим динамический запрос и выполняем его через exec.


 
12 ©   (2010-10-08 14:45) [3]

не понял вас..


 
stas ©   (2010-10-08 14:54) [4]

Ну допустим, у вас в таблице [10.171.1.5].[icm1_hds].[dbo].[t_Dialer_Detail] есть поле ID какое нибудь.
то строим запрос таким образом
Select
      c1=MAX(case when id=1 then  Convert(char(19),[DateTime],121) + Cast(CallResult as char(3)) else NULL end)
C2=MAX(case when id=2 then  Convert(char(19),[DateTime],121) + Cast(CallResult as char(3)) else NULL end)
FROM
 [10.171.1.5].[icm1_hds].[dbo].[t_Dialer_Detail]
WHERE
 DialingListID = @id
В данном случае группировка ненужна, если надо, то сгруппируйте.


 
stas ©   (2010-10-08 14:56) [5]

Это статичный запрос т.е. заранее известно сколько будет колонок. А динамичный строите тоже самое в цикле и записываете в строковую переменную, которую потом выполните через exec.


 
12 ©   (2010-10-08 15:04) [6]

не, внутреннего ID второй таблицы нет

SELECT [DateTime], [CallResult]
From  [10.171.1.5].[icm1_hds].[dbo].[t_Dialer_Detail]  -- T2
[2010-10-08 14:39:29.267] [8]
[2010-10-08 14:50:15.240] [10]


а
SELECT   DialingListID ID,   CallResult,   dbo.GetDetailDialer(DialingListID) Detail
FROM   [10.171.0.4].[icm1_baA].[dbo].[DL_5010_5008] -- T1
[59] [10] [2010-10-08 14:39:29 8  2010-10-08 14:50:15 10]

а хотелось бы
[59] [10] [2010-10-08 14:39:29] [8]  [2010-10-08 14:50:15] [10]

а я думаю типа что-то

CREATE FUNCTION DialerDetail
( @IDC int )
RETURNS
@DialerDetail TABLE
(ID int,
C1 datetime,
R1 int,
C2 datetime,
R2 int,
C3 datetime,
R3 int,
C4 datetime,
R4 int,
C5 datetime,
R5 int)
AS
тут курсор :(, который заполняет таблицу

и потом
select *
from T1 join DialerDetail(T1.ID)


 
12 ©   (2010-10-08 15:05) [7]


> тут курсор :(, который заполняет таблицу

вот это и не нравится


 
stas ©   (2010-10-08 15:09) [8]

Если взять за основу Ваш пример, то можно так:

Declare @sql nvarchar(max)
SET @SQL="select "

SELECT
 @SQL = @SQL +"К"+cast(NOMZAP as nvarchar(5))+"="+ Convert(char(19),[DateTime],121) + Cast(CallResult as char(3))
From
[10.171.1.5].[icm1_hds].[dbo].[t_Dialer_Detail]
WHERE
 DialingListID = @id
 
 
--убрать лишние запятые из @sql  
...

EXEC @SQL


 
stas ©   (2010-10-08 15:10) [9]

Тут nomzap какой-то идентификатор


 
12 ©   (2010-10-08 15:46) [10]

аа..
дошло :)


 
12 ©   (2010-10-08 17:36) [11]

но долго, не годится
10 000 записей в T1 и совсем скучно становится. А планируемое - до 100 000...


 
DiamondShark ©   (2010-10-08 18:07) [12]


> не, внутреннего ID второй таблицы нет

Тогда никак.
Или курсор.


 
sniknik ©   (2010-10-08 18:37) [13]

чето никак не пойму чего тебе надобно... можешь на пальцах объяснить, БЕЗ запросов, которые как сам признаешь не работают так как тебе нужно, но ты этими кривыми запросами почему то описываешь логику...
вместо приведения исходного набора данных, и того во что он должен "превратится".

вообще  поворот таблицы делается  через pivot table (в аксесс команда, в mssql раздел справки в котором описано как)


 
stas ©   (2010-10-11 13:39) [14]

12 ©   (08.10.10 17:36) [11]
Честно говоря не понял почему долго. 100 000 это немного. Да и столбцов может быть ограниченное количество.

sniknik ©   (08.10.10 18:37) [13]
В MS SQL как я понял pivot работает только с фиксированным набором столбцов в отличии от акцесса, непонятно правда почему так в mssql.



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.007 c
6-1232800121
DmitryG.
2009-01-24 15:28
2011.01.02
Проверка существования ресурса через TIdHTTP


15-1285062621
DiamondShark
2010-09-21 13:50
2011.01.02
3Д-экшон суть такова...


15-1284669964
картман
2010-09-17 00:46
2011.01.02
нечеткий поиск в БД


2-1286378357
faiwer
2010-10-06 19:19
2011.01.02
PageControl и onShow


2-1286535934
noob_one
2010-10-08 15:05
2011.01.02
Как из переменной перечисляемого типа получить строку




   Наверх