我在下面的存储过程中有一个查询
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完成吗?
答案 0 :(得分: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]
很少有重要说明:
NULL
的{{1}}值将始终为x
等级1
和x
答案 1 :(得分:0)
你需要UNION ALL来添加额外的行,你还需要对它们进行ORDER,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
答案 2 :(得分: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