2015-06-09 86 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