使用另一个表中的值填充SQL中的列

时间:2015-04-20 10:40:44

标签: sql sql-server sequence

这是我的第一篇文章,如果格式不正确,请注意。

我正在为饼图创建数据集,对于每一行,我需要在颜色表中添加颜色(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。

你可以帮助我帮助我吗?任何帮助赞赏。 尼克。

2 个答案:

答案 0 :(得分: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;

注意:您应该只对字符串和日期常量使用单引号。不要对列别名使用单引号。

答案 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