在从存储过程执行的查询中添加列

时间:2015-06-09 10:25:22

标签: sql-server tsql 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完成吗?

3 个答案:

答案 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]

enter image description here

很少有重要说明:

  • 每个NULL的{​​{1}}值将始终为x等级
  • 最终结果集按1x
  • 排序

答案 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