SQL按值分割列

时间:2016-03-03 20:36:23

标签: sql

我已经搜索过并搜索过,但我甚至不确定该怎么称呼它。我试图编写一个使用键值分割数据的SQL查询...

╔═══╦═══╦═══╗
║ a ║ d ║ g ║
║ b ║ e ║ h ║
║ c ║ f ║ i ║
╚═══╩═══╩═══╝

要...

intent.setType("text/*");

这叫什么,我该怎么做?

2 个答案:

答案 0 :(得分:0)

这很有效,但很麻烦。

忽略#Test的创建,因为您已有该表

IF OBJECT_ID('tempdb..#Test') IS NOT NULL
DROP TABLE #Test

IF OBJECT_ID('tempdb..#Results') IS NOT NULL
DROP TABLE #Results

DECLARE @i AS INTEGER
SET @i = 1

CREATE TABLE #Test
(Type INT
,Data CHAR(1))

INSERT INTO #Test
VALUES
(1, 'a'),
(1, 'b'),
(1, 'c'),
(2, 'd'),
(2, 'e'),
(2, 'f'),
(3, 'g'),
(3, 'h'),
(3, 'i')

CREATE TABLE #Results
([1] CHAR(1)
,[2] CHAR(2)
,[3] CHAR(3))

WHILE @i <= (SELECT COUNT(*) FROM #Test WHERE Type = 1)

BEGIN

INSERT INTO #Results
SELECT
(SELECT TOP 1 Data FROM #Test WHERE Type = 1 AND Data NOT IN (SELECT [1] FROM #Results)) [1]
,(SELECT TOP 1 Data FROM #Test WHERE Type = 2 AND Data NOT IN (SELECT [2] FROM #Results)) [2]
,(SELECT TOP 1 Data FROM #Test WHERE Type = 3 AND Data NOT IN (SELECT [3] FROM #Results)) [3]
FROM #Test

SET @i = @i + 1

END

SELECT DISTINCT * FROM #Results

答案 1 :(得分:0)

一种方法可能是创建与组相同数量的辅助表。因此,您将创建table1table2table3

然后,您将第1组中的所有值SELECT DISTINCT转换为table1,依此类推。

现在您需要将这三个表拼接为新表中的列。为此,您需要另一个元素 - 计数器。根据您的SQL风格,您可以通过几种不同的方式执行此操作。

最后,您将有三个表格

Table1        Table2       Table3
id  value     id  value    id value
1   a         1   d        1  f
2   b         2   e        2  g
3   c                      3  h
                           4  i

要将这些链接在一起,请选择最长的一个并与其他人一起运行LEFT JOIN

SELECT table1.value AS group1, table2.value AS group2, table3.value AS group3 
FROM table3 
LEFT JOIN table2 ON (table3.id = table2.id)
LEFT JOIN table1 ON (table3.id = table1.id);

并将获得

group1    group2   group3
a         d        f
b         e        g
c         NULL     h
NULL      NULL     i

您还可以使用一个附加列对原始表中的所有值进行增量分组编号:

xid    group    value
1      1        a
2      1        b
3      1        c
1      2        d
2      2        e
1      3        f
...

请注意(group,xid)现在是主键。现在你可以自己加入你的桌子了:

 SELECT t1.value AS g1, t2.value AS g2, t3.value AS g3
 FROM yourtable AS t3
 LEFT JOIN yourtable AS t1 ON (t3.xid = t1.xid)
 LEFT JOIN yourtable AS t2 ON (t3.xid = t2.xid)

此处,第3组是具有最大基数的组。这不需要额外的表,但是用于缝合枢轴的一个额外列xid的编号稍微复杂一些。