SQL Server的并排行

时间:2018-11-26 19:23:59

标签: sql-server

我需要从表(img 1)中获取数据,并放在同一行(img 2)

我该怎么做?

它必须在SQL Server上

我已经尝试过在select中进行选择,但是我认为我不知道这样做的正确方法,或者如果这样做不行。

    select * from tblTest
    where exists(select * from tblTest)

我有什么

https://i.stack.imgur.com/aDgbc.png

我需要什么

https://i.stack.imgur.com/ubVJA.png

3 个答案:

答案 0 :(得分:0)

这是对OP的最后一条评论的猜测:“我要说的是,每3行,我需要全部包含1行。” 。我怀疑他们因此想要:

WITH CTE AS(
    SELECT {YourColumns},
           ROW_NUMBER() OVER (ORDER BY ID) - 1 AS RN
    FROM {YourTable})
SELECT {YourColumns}
FROM CTE C1
     LEFT JOIN CTE C2 ON C1.RN + 1 = C2.RN
     LEFT JOIN CTE C3 ON C2.RN + 1 = C3.RN
WHERE C1.RN % 3 = 0;

您需要用相应的对象名称替换括号({})中的部分。另外,请注意,除了很小的数据集外,这很可能在其他任何地方都表现不佳。该查询远非SARGable。

编辑:关于您帖子中的查询,我担心这没有任何意义。

select * from tblTest
where exists(select * from tblTest)

这实际上是在声明“如果表tblTest中有行,则返回表tblTest中的所有行和列。因此EXISTS完全没有意义,就像tblTest中没有行,则SELECT仍将不返回任何行。检查行是否存在只能对表进行进一步扫描。

您似乎对SQL还是很陌生,所以首先在线查找一些教程和指南可能是一个主意,以便您掌握基础知识。

答案 1 :(得分:0)

我认为您正在寻找

CREATE TABLE T(
  ID INT,
  Aux INT,
  Test1 VARCHAR(10),
  Test2 VARCHAR(10),
  Test3 VARCHAR(10)
);

INSERT INTO T VALUES
(1, 10, 'ABC', 'DEF', 'GHI'),
(2, 11, '123', '456', '789'),
(3, 12, 'Foo', 'Bar', 'None');

SELECT T2.*,
       T1.*
FROM T T1 RIGHT JOIN T T2 ON T1.ID = T2.ID +1
WHERE T2.ID % 2 > 0;

返回:

+----+-----+-------+-------+-------+------+------+-------+-------+-------+
| ID | Aux | Test1 | Test2 | Test3 |  ID  | Aux  | Test1 | Test2 | Test3 |
+----+-----+-------+-------+-------+------+------+-------+-------+-------+
|  1 |  10 | ABC   | DEF   | GHI   | 2    | 11   | 123   | 456   | 789   |
|  3 |  12 | Foo   | Bar   | None  | NULL | NULL | NULL  | NULL  | NULL  |
+----+-----+-------+-------+-------+------+------+-------+-------+-------+

Demo

更新

INSERT INTO T VALUES
(1, 10, 'ABC', 'DEF', 'GHI'),
(2, 11, '123', '456', '789'),
(3, 12, 'Foo', 'Bar', 'None'),
(4, 13, 'JKL', 'MNO', 'PQR'),
(5, 13, 'STU', 'VWX', 'XZ!'),
(6, 14, 'AZE', 'RTY', 'UIO');

SELECT *
FROM T T1 LEFT JOIN T T2 ON T2.ID - 1 = T1.ID
          LEFT JOIN T T3 ON T3.ID - 1 = T2.ID
WHERE T1.ID % 3 = 1;

返回:

+----+-----+-------+-------+-------+----+-----+-------+-------+-------+----+-----+-------+-------+-------+
| ID | Aux | Test1 | Test2 | Test3 | ID | Aux | Test1 | Test2 | Test3 | ID | Aux | Test1 | Test2 | Test3 |
+----+-----+-------+-------+-------+----+-----+-------+-------+-------+----+-----+-------+-------+-------+
|  1 |  10 | ABC   | DEF   | GHI   |  2 |  11 | 123   | 456   | 789   |  3 |  12 | Foo   | Bar   | None  |
|  4 |  13 | JKL   | MNO   | PQR   |  5 |  13 | STU   | VWX   | XZ!   |  6 |  14 | AZE   | RTY   | UIO   |
+----+-----+-------+-------+-------+----+-----+-------+-------+-------+----+-----+-------+-------+-------+

Demo

答案 2 :(得分:0)

假设表中的行多于2或3行,则将需要动态sql。以下方法可以解决问题。

USE tempdb;
GO

SET NOCOUNT ON;

IF OBJECT_ID('tempdb.dbo.TestData', 'U') IS NOT NULL 
BEGIN DROP TABLE dbo.TestData; END;

CREATE TABLE dbo.TestData (
    ID INT NOT NULL,
    Aux INT NOT NULL,
    Test1 CHAR(3) NOT NULL,
    Test2 CHAR(3) NOT NULL,
    Test3 CHAR(3) NOT NULL 
    );
INSERT dbo.TestData (ID, Aux, Test1, Test2, Test3) VALUES
    (1, 10, 'ABC', 'DEF', 'GHI'),
    (2, 11, '123', '456', '789');


-- SELECT * FROM dbo.TestData td;

--=============================================================

DECLARE 
    @sql NVARCHAR(MAX) = N'',
    @debug BIT = 0;

SELECT TOP (2147483647)
    @sql = CONCAT(@sql, N',
    ID  = MAX(CASE WHEN td.ID = ', td.ID, N' THEN ', td.ID , N' END),
    AUX = MAX(CASE WHEN td.ID = ', td.ID, N' THEN ', td.Aux, N' END),
    Test1 = MAX(CASE WHEN td.ID = ', td.ID, N' THEN ''', td.Test1, N''' END),
    Test2 = MAX(CASE WHEN td.ID = ', td.ID, N' THEN ''', td.Test2, N''' END),
    Test3 = MAX(CASE WHEN td.ID = ', td.ID, N' THEN ''', td.Test3, N''' END)'
    )
FROM
    dbo.TestData td
ORDER BY 
    td.ID;

SET @sql = CONCAT(N'
SELECT', STUFF(@sql, 1, 1, ''), N'
FROM 
    dbo.TestData td;');

IF @debug = 1 
BEGIN
    PRINT(@sql);
END;
ELSE
BEGIN
    EXEC sys.sp_executesql @sql;
END;

结果:

ID          AUX         Test1 Test2 Test3 ID          AUX         Test1 Test2 Test3
----------- ----------- ----- ----- ----- ----------- ----------- ----- ----- -----
1           10          ABC   DEF   GHI   2           11          123   456   789