Sql server 复杂的T-SQL查询,通过将多个单元格连接到一列中来派生某些列

Sql server 复杂的T-SQL查询,通过将多个单元格连接到一列中来派生某些列,sql-server,tsql,substring,pivot,sql-view,Sql Server,Tsql,Substring,Pivot,Sql View,考虑一个包含名称和代码的数据库表-有没有办法创建类似的视图: ? “代码”列中的不同数字表示此人是领导者或小组成员。根据这些数字,确定其他列的数据 我编写了一个脚本,在临时表中逐行生成和插入数据,但基本表数据不断变化,我需要这样的视图: 从显示实时数据的基元表中。这可能吗 一种方法是使用CASE表达式和子查询返回leader数据,如下例所示。如果这对您不起作用,请在您的问题中添加CREATE TABLE和INSERT语句,这样我们可以更容易地帮助您 CREATE TABLE dbo.Fubar

考虑一个包含名称和代码的数据库表-有没有办法创建类似的视图:

?

“代码”列中的不同数字表示此人是领导者或小组成员。根据这些数字,确定其他列的数据

我编写了一个脚本,在临时表中逐行生成和插入数据,但基本表数据不断变化,我需要这样的视图:

从显示实时数据的基元表中。这可能吗


一种方法是使用
CASE
表达式和子查询返回leader数据,如下例所示。如果这对您不起作用,请在您的问题中添加
CREATE TABLE
INSERT
语句,这样我们可以更容易地帮助您

CREATE TABLE dbo.Fubar(
      Code char(6) NOT NULL
    , FullName char(1) NOT NULL
);

INSERT INTO dbo.Fubar VALUES
      ('526010', 'A')
    , ('526011', 'B')
    , ('526012', 'C')
    , ('526013', 'D')
    , ('526020', 'E')
    , ('526021', 'F')
    , ('526022', 'G')
    , ('526110', 'H')
    , ('526111', 'I')
    , ('526112', 'J')
    , ('526510', 'K')
    , ('526511', 'L')
    , ('526512', 'M');
GO

CREATE VIEW dbo.vw_Fubar
AS
SELECT
      a.Code
    , a.FullName
    , SUBSTRING(a.Code, 3, 3) AS gCode
    , CASE
        WHEN RIGHT(Code, 1) = '0' THEN '~' + a.FullName + '~'
        ELSE
            (SELECT '~' + b.FullName FROM dbo.Fubar AS b WHERE b.Code = LEFT(a.Code, 5) + '0') + '~' + a.FullName + '~'
        END AS Team
    , CASE
        WHEN RIGHT(Code, 1) = '0' THEN '~' + SUBSTRING(Code, 3, 3) + '~'
        ELSE
            (SELECT '~' + SUBSTRING(b.Code, 3, 3) FROM dbo.Fubar AS b WHERE b.Code = LEFT(a.Code, 5) + '0') + '~' + RIGHT(a.Code, 4) + '~'
        END AS TeamCode
FROM dbo.Fubar AS a;
GO

SELECT
      Code
    , FullName
    , gCode
    , Team
    , TeamCode
FROM dbo.vw_Fubar
GO

+--------+----------+-------+-------+------------+
|  Code  | FullName | gCode | Team  |  TeamCode  |
+--------+----------+-------+-------+------------+
| 526010 | A        |   601 | ~A~   | ~601~      |
| 526011 | B        |   601 | ~A~B~ | ~601~6011~ |
| 526012 | C        |   601 | ~A~C~ | ~601~6012~ |
| 526013 | D        |   601 | ~A~D~ | ~601~6013~ |
| 526020 | E        |   602 | ~E~   | ~602~      |
| 526021 | F        |   602 | ~E~F~ | ~602~6021~ |
| 526022 | G        |   602 | ~E~G~ | ~602~6022~ |
| 526110 | H        |   611 | ~H~   | ~611~      |
| 526111 | I        |   611 | ~H~I~ | ~611~6111~ |
| 526112 | J        |   611 | ~H~J~ | ~611~6112~ |
| 526510 | K        |   651 | ~K~   | ~651~      |
| 526511 | L        |   651 | ~K~L~ | ~651~6511~ |
| 526512 | M        |   651 | ~K~M~ | ~651~6512~ |
+--------+----------+-------+-------+------------+

一种方法是使用
CASE
表达式和子查询返回leader数据,如下例所示。如果这对您不起作用,请在您的问题中添加
CREATE TABLE
INSERT
语句,这样我们可以更容易地帮助您

CREATE TABLE dbo.Fubar(
      Code char(6) NOT NULL
    , FullName char(1) NOT NULL
);

INSERT INTO dbo.Fubar VALUES
      ('526010', 'A')
    , ('526011', 'B')
    , ('526012', 'C')
    , ('526013', 'D')
    , ('526020', 'E')
    , ('526021', 'F')
    , ('526022', 'G')
    , ('526110', 'H')
    , ('526111', 'I')
    , ('526112', 'J')
    , ('526510', 'K')
    , ('526511', 'L')
    , ('526512', 'M');
GO

CREATE VIEW dbo.vw_Fubar
AS
SELECT
      a.Code
    , a.FullName
    , SUBSTRING(a.Code, 3, 3) AS gCode
    , CASE
        WHEN RIGHT(Code, 1) = '0' THEN '~' + a.FullName + '~'
        ELSE
            (SELECT '~' + b.FullName FROM dbo.Fubar AS b WHERE b.Code = LEFT(a.Code, 5) + '0') + '~' + a.FullName + '~'
        END AS Team
    , CASE
        WHEN RIGHT(Code, 1) = '0' THEN '~' + SUBSTRING(Code, 3, 3) + '~'
        ELSE
            (SELECT '~' + SUBSTRING(b.Code, 3, 3) FROM dbo.Fubar AS b WHERE b.Code = LEFT(a.Code, 5) + '0') + '~' + RIGHT(a.Code, 4) + '~'
        END AS TeamCode
FROM dbo.Fubar AS a;
GO

SELECT
      Code
    , FullName
    , gCode
    , Team
    , TeamCode
FROM dbo.vw_Fubar
GO

+--------+----------+-------+-------+------------+
|  Code  | FullName | gCode | Team  |  TeamCode  |
+--------+----------+-------+-------+------------+
| 526010 | A        |   601 | ~A~   | ~601~      |
| 526011 | B        |   601 | ~A~B~ | ~601~6011~ |
| 526012 | C        |   601 | ~A~C~ | ~601~6012~ |
| 526013 | D        |   601 | ~A~D~ | ~601~6013~ |
| 526020 | E        |   602 | ~E~   | ~602~      |
| 526021 | F        |   602 | ~E~F~ | ~602~6021~ |
| 526022 | G        |   602 | ~E~G~ | ~602~6022~ |
| 526110 | H        |   611 | ~H~   | ~611~      |
| 526111 | I        |   611 | ~H~I~ | ~611~6111~ |
| 526112 | J        |   611 | ~H~J~ | ~611~6112~ |
| 526510 | K        |   651 | ~K~   | ~651~      |
| 526511 | L        |   651 | ~K~L~ | ~651~6511~ |
| 526512 | M        |   651 | ~K~M~ | ~651~6512~ |
+--------+----------+-------+-------+------------+

非常感谢非常感谢