我有一個像下面在從存儲過程執行查詢時添加列
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來完成嗎?
我有一個像下面在從存儲過程執行查詢時添加列
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來完成嗎?
您需要聯合所有添加額外的行,您還需要對它們進行排序,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
這是工作例如:
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]
幾個重要事項:
x
的NULL
值會隨着等級1
總是x
和rank
都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
你能解釋一下爲什麼你需要插入零一排?這似乎是一個奇怪的要求,在SQL中做這樣的事情。 – Tanner
我正在使用查詢數據來生成報告,並且當x的值發生變化時,報告要求需要我將空白置爲 – Charles
聽起來像您正在尋找對您的問題的錯誤解決方案。大多數報告工具都應該能夠處理數據組,而無需以這種方式處理源數據。你需要使用組標題行或類似的東西。 – Tanner