2015-06-09 45 views
0

我有一个像下面在从存储过程执行查询时添加列

select x,y from table 

在存储过程的查询,其结果将类似于下面

x y 
1 a 
1 b 
2 a 
2 b 
3 a 
3 b 

我需要添加一个空白当x的值如下变化时,列或零点

x y 
1 a 
1 b 
0 0 
2 a 
2 b 
0 0 
3 a 
3 b 

这可以通过SQL或因为我使用的数据对于birt报告,这可以用birt来完成吗?

+2

你能解释一下为什么你需要插入零一排?这似乎是一个奇怪的要求,在SQL中做这样的事情。 – Tanner

+0

我正在使用查询数据来生成报告,并且当x的值发生变化时,报告要求需要我将空白置为 – Charles

+2

听起来像您正在寻找对您的问题的错误解决方案。大多数报告工具都应该能够处理数据组,而无需以这种方式处理源数据。你需要使用组标题行或类似的东西。 – Tanner

回答

0

您需要联合所有添加额外的行,您还需要对它们进行排序,DENSE_RANK是摆脱多余的行。

这里是它如何做到:

DECLARE @t table(x int, y char(1)) 
INSERT @t values 
(1,'a'),(1,'b'),(2,'a'), 
(2,'b'),(3,'a'),(3,'b') 

;WITH CTE AS 
(
    SELECT 
    2 rn, x,y, x sort from @t 
    UNION ALL 
    SELECT 
    distinct dense_rank() over (order by x desc) rn, 0, '0', x+.1 sort 
    FROM @t 
) 
SELECT x,y 
FROM CTE 
WHERE rn > 1 
ORDER BY sort, x 

结果:

x y 
1 a 
1 b 
0 0 
2 a 
2 b 
0 0 
3 a 
3 b 
0

这是工作例如:

DECLARE @DataSource TABLE 
(
    [x] TINYINT 
    ,[y] CHAR(1) 
); 

INSERT INTO @DataSource ([x], [y]) 
VALUES (1, 'a') 
     ,(1, 'b') 
     ,(2, 'a') 
     ,(2, 'b') 
     ,(3, 'a') 
     ,(3, 'b'); 

WITH DataSource AS 
(
    SELECT * 
    FROM @DataSource 
    UNION ALL 
    -- the NULL will be always displayed on the first position 
    SELECT DISTINCT [x] 
        ,NULL 
    FROM @DataSource 
) 
SELECT IIF([Rank] = 1, 0, [x]) 
     ,IIF([Rank] = 1, 0, [x]) 
FROM 
(
    SELECT ROW_NUMBER() OVER(PARTITION BY [x] ORDER BY [y]) AS [Rank] 
      ,[x] 
      ,[y] 
    FROM DataSource 
) DS 
ORDER BY [x] 
     ,[Rank] 

enter image description here

几个重要事项:

  • 每个xNULL值会随着等级1总是
  • 最终结果集排序方式为xrank
0
declare @t table (X varchar(1),Y varchar(1)) 
insert into @t(X,y) values (1,'A'), 
(1,'B'), 
(2,'A'), 
(2,'B'), 
(3,'A'), 
(3,'B') 


;with CTE As(
select X,Y,ROW_NUMBER()OVER(PARTITION BY X,Y ORDER BY X)RN 
from @t 
CROSS APPLY 
(
    values 
     ('',NULL), 
     ('',NULL) 
) C(R, N)), 
CTE2 AS(

Select CASE WHEN RN > 1 THEN 0 ELSE X END X , 
     CASE WHEN RN > 1 THEN CAST(0 AS VARCHAR) ELSE Y END ID 
     ,ROW_NUMBER()OVER(PARTITION BY X ORDER BY (SELECT NULL)) R 
     FROM CTE 
) 
select X,ID from cte2 where R <> 2