在结果集的单列中交叉值

时间:2012-08-22 15:18:51

标签: sql-server-2008 tsql

假设我们在SQL表的两列中有这样的值

HM        BOX_NO

A          1
A          2
B          2
B          3
C          3

我想输出这些表值,如下所示 我怎样才能做到这一点?

A
1
2
B
2
3
C
3

4 个答案:

答案 0 :(得分:2)

我假设您希望来自HM的不同值与来自BOX_NO的值出现在HM的每个值下面。

你可以这样做。可能比你想象的要复杂得多:

select val
from ((select distinct hm as val, 1 as ishm,
              dense_rank() over (order by HM) as ranking
       from t
      ) union all
      (select cast(box_no as varchar(255)), 0 as ishm,
              dense_rank() over (order by HM) as ranking
       from t
      )
     ) a
order by ranking, ishm desc, val

答案 1 :(得分:2)

CREATE TABLE #t
    ([HM] varchar(1), [BOX_NO] int);

INSERT INTO #t
    ([HM], [BOX_NO])
VALUES
    ('A', 1),
    ('A', 2),
    ('B', 2),
    ('B', 3),
    ('C', 3);

SELECT  item
FROM (
    SELECT  DISTINCT HM as item, HM as display_order
    FROM    #t  
    UNION ALL
    SELECT  CAST([BOX_NO] AS VARCHAR(10)), HM + CAST([BOX_NO] AS VARCHAR(10))as display_order
    FROM    #t  
) a
ORDER BY display_order  

答案 2 :(得分:2)

SELECT
  Value = COALESCE(CAST(BOX_NO AS varchar(10)), HM)
FROM (
  SELECT          HM, BOX_NO FROM atable
  UNION ALL
  SELECT DISTINCT HM, NULL   FROM atable
) s
ORDER BY HM, BOX_NO
;

这是一个演示at SQL Fiddle

答案 3 :(得分:1)

试试这个

Declare @t Table([HM] varchar(1), [BOX_NO] int);

INSERT INTO @t([HM], [BOX_NO])
VALUES
    ('A', 1),
    ('A', 2),
    ('B', 2),
    ('B', 3),
    ('C', 3);

;With Cte As(
Select 
      Rn
     ,HM
    ,BOX_NO
    ,HM_Grouping = HM + Cast(Rn As Varchar(1))
From (Select Rn = Row_Number() Over(Partition By HM Order by HM),*
      From @t)x)
Select HM 
From
    (Select HM,Position = HM
    From Cte Where Rn = 1
    Union All
    Select Cast(BOX_NO As Varchar(1)),HM_Grouping
    From Cte)x
Order by Position 

<强>结果

HM
A
1
2
B
2
3
C
3