我有一个像下面在从存储过程执行查询时添加列
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