![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
MSSQL. Два столбца в одну строку.
12 © (2010-10-08 14:35:00)Есть таблица, пусть 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-11 13:39:00) [1]12 © (08.10.10 17:36) [11]
Честно говоря не понял почему долго. 100 000 это немного. Да и столбцов может быть ограниченное количество.
sniknik © (08.10.10 18:37) [13]
В MS SQL как я понял pivot работает только с фиксированным набором столбцов в отличии от акцесса, непонятно правда почему так в mssql.
sniknik (2010-10-08 18:37:00) [2]чето никак не пойму чего тебе надобно... можешь на пальцах объяснить, БЕЗ запросов, которые как сам признаешь не работают так как тебе нужно, но ты этими кривыми запросами почему то описываешь логику...
вместо приведения исходного набора данных, и того во что он должен "превратится".
вообще поворот таблицы делается через pivot table (в аксесс команда, в mssql раздел справки в котором описано как)
DiamondShark (2010-10-08 18:07:00) [3]
> не, внутреннего ID второй таблицы нет
Тогда никак.
Или курсор.
12 (2010-10-08 17:36:00) [4]но долго, не годится
10 000 записей в T1 и совсем скучно становится. А планируемое - до 100 000...
12 (2010-10-08 15:46:00) [5]аа..
дошло :)
stas (2010-10-08 15:10:00) [6]Тут nomzap какой-то идентификатор
stas (2010-10-08 15:09:00) [7]Если взять за основу Ваш пример, то можно так:
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
12 (2010-10-08 15:05:00) [8]
> тут курсор :(, который заполняет таблицу
вот это и не нравится
12 (2010-10-08 15:04:00) [9]не, внутреннего 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)
stas (2010-10-08 14:56:00) [10]Это статичный запрос т.е. заранее известно сколько будет колонок. А динамичный строите тоже самое в цикле и записываете в строковую переменную, которую потом выполните через exec.
stas (2010-10-08 14:54:00) [11]Ну допустим, у вас в таблице [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:45:00) [12]если нет, то тоже самое только строим динамический запрос и выполняем его через exec.
12 (2010-10-08 14:45:00) [13]не понял вас..
stas (2010-10-08 14:42:00) [14]если столбцы статичны, то:
case + group by