2015-04-20 7 views
0

Это мой первый пост, поэтому при условии, что форматирование неверно.Заполнение столбца в SQL со значениями из другой таблицы

Я создаю набор данных для круговой диаграммы и для каждой строки, мне нужно добавить цвет (COL_COL) и цветное выделение (COL_HIG) из таблицы цветов, которая выглядит так.

CREATE TABLE [dbo].[T_COL](
    [COL_SEQ] [int] IDENTITY(1,1) NOT NULL, 
    [COL_COL] [nvarchar](20) NULL, 
    [COL_HIG] [nvarchar](20) NULL, 
    [COL_NAM] [nvarchar](50) NULL, 
    [COL_DEL] [bit] NOT NULL, 
) 

INSERT INTO [dbo].[T_COL]   ([COL_COL] 
      ,[COL_HIG] 
      ,[COL_NAM] 
      ,[COL_DEL]) 
    VALUES 
      ('#F7464A', '#FF5A5E','Red', 0), 
      ('#46BFBD', '#5AD3D1','Green', 0), 
      ('#FDB45C', '#FFC870','Yellow', 0), 
      ('#949FB1', '#A8B3C5','Grey', 0), 
      ('#4D5360', '#616774','Dark Grey', 0) 

SQL, чтобы генерировать свои данные из таблицы аудита ...

select count(*) as 'Visits', 
    datename(mm, AUD_DAT) as 'Month', 
    'Unique Visits by Month' as 'Title', 
    datepart(mm, AUD_DAT) as 'MonthNo', 
     ROW_NUMBER() OVER (ORDER BY datename(mm, AUD_DAT)) AS 'rownum', 
    null as 'colour', 
    null as 'ColHightlight' 
    into #temp 
    from dbo.T_AUD 
    where AUD_TYP_SEQ = 3 and datepart(year, AUD_DAT) = @year 
    group by datename(mm, AUD_DAT),datepart(mm, AUD_DAT) 
    order by datepart(mm, AUD_DAT) 

Этот запрос возвращает 8 строк и есть пять цветов в таблице цветов. Я пытаюсь добраться до точки, где строка 1-5 содержит цвет 1-5, тогда строка 6 будет содержать цвет 1, 7 содержит цвет 2 и т. Д. Вместо того, чтобы жестко кодировать количество цветов, я хотел бы использовать подсчет таблицы цветов, поскольку количество будет изменяться, когда цвета будут добавлены в эту таблицу.

Я попытался использовать функцию row_number, но это просто увеличивает число для каждой строки, и я не уверен, могу ли я сбросить его до 1, когда он попадает в подсчет таблицы цветов.

Не могли бы вы помочь мне в этом? Любая помощь оценивается. Ник.

ответ

0

Сделайте что-нибудь подобное. ctecolors будет отмечать строки rn(0, 1, 2, 3, 4). teaud отметит rn(0, 1, 2, 3, 4, 0, 1....). Затем простое соединение на rn.

;with ctecolors as 
(select *, -1+row_number() over(order by (select 1)) rn from [dbo].[T_COL]), 

cteaud as 
( select count(*) as 'Visits', 
    datename(mm, AUD_DAT) as 'Month', 
    'Unique Visits by Month' as 'Title', 
    datepart(mm, AUD_DAT) as 'MonthNo', 
     (-1+ROW_NUMBER() OVER (ORDER BY datename(mm, AUD_DAT))) % 5 AS rn 
    from dbo.T_AUD 
    where AUD_TYP_SEQ = 3 and datepart(year, AUD_DAT) = @year 
    group by datename(mm, AUD_DAT),datepart(mm, AUD_DAT)) 

Select Visits,Month,Title,MonthNo, ctecolors.* into #temp 
from ctecolors cc 
join cteaud ca on cc.rn = ca.rn 
+0

Спасибо за вашу помощь, но я получаю следующую ошибку и не знаю, как ее решить. _ «Имена столбцов в каждой таблице должны быть уникальными. Имя столбца« rn »в таблице« #temp »указано более одного раза.» _ – MrNick

+0

@MrNick. Это потому, что вы вставляете в временную таблицу и есть два столбца ' rn'. Просто измените выбор на различные имена столбцов. Я отредактировал ответ. –

+0

Спасибо, что сработало после нескольких незначительных корректировок. Мне пришлось изменить последние две строки на это из _ctecolors join cteaud ca на ctecolors.rn = ca.rn_ и изменить твердое значение 5 на счет таблицы цветов _ (выберите count (*) из [dbo]. [ T_COL] c, где c.COL_DEL = 0) _. – MrNick

0

Если я правильно понимаю, вы можете делать то, что хотите, используя арифметику по модулю. Мне непонятно, какие таблицы, на которые вы ссылаетесь, связаны с вашей проблемой (это таблицы цветов, которые должны быть t_col? Не знаю).

Следующий запрос дает подход для того, как решить эту проблему:

with yourquery as (
     <your query> 
    ) 
select y.*, c.* 
from yourquery y join 
    (select c.*, row_number() over (order by id) as seqnum, 
      count(*) over() as numcolors 
     from colors 
    ) c 
    on y.rownum % c.numcolors = c.seqnum - 1; 

Примечание: Вы должны использовать только одиночные кавычки для строк и даты констант. Не используйте одинарные кавычки для псевдонимов столбцов.

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