复杂的 T-SQL 查询通过将多个单元格连接成一列来派生一些列
Complex T-SQL query to derive some columns by concatenating multiple cells into a column
考虑一个数据库 table 保存名称和代码 - 有没有办法创建类似的视图:
?
'code' 列中的各种数字表示此人是领导者或小组成员。并根据这些数字确定其他列的数据。
我写了一个脚本,在临时 table 中逐行生成和插入数据,但是原始 table 数据在不断变化,我需要这样的视图:
来自显示实时数据的原始 table。这可能吗?
一种方法是使用 CASE
表达式和对 return 领导者数据的子查询,如下例所示。如果这对您不起作用,请在您的问题中添加 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~ |
+--------+----------+-------+-------+------------+
考虑一个数据库 table 保存名称和代码 - 有没有办法创建类似的视图:
'code' 列中的各种数字表示此人是领导者或小组成员。并根据这些数字确定其他列的数据。
我写了一个脚本,在临时 table 中逐行生成和插入数据,但是原始 table 数据在不断变化,我需要这样的视图:
来自显示实时数据的原始 table。这可能吗?
一种方法是使用 CASE
表达式和对 return 领导者数据的子查询,如下例所示。如果这对您不起作用,请在您的问题中添加 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~ |
+--------+----------+-------+-------+------------+