use*_*516 1 sql t-sql sql-server
可以说我有这个测试表:
CREATE TABLE Test (AdrNr INT, Nr1 INT, Nr2 INT, Nr3 INT, Nr4 INT, Nr5 INT, Nr6 INT, Nr7 INT)
INSERT INTO @t
VALUES (500, 3, 4, 8, 42, 5, 76, 91)
Run Code Online (Sandbox Code Playgroud)
现在我想知道任何Nr1..Nr7列中是否有8 个:
SELECT *
FROM Test
WHERE 8 IN (Nr1, Nr2, Nr3, Nr4, Nr5, Nr6, Nr7);
Run Code Online (Sandbox Code Playgroud)
这工作得很好,但我的问题是,是否有可能得到的AdrNr,然后只从列Nr1到Nr7具有8.
结果应该是:
AdrNr Nr3
500 8
Run Code Online (Sandbox Code Playgroud)
DECLARE @t TABLE (AdrNr INT, Nr1 INT, Nr2 INT, Nr3 INT, Nr4 INT, Nr5 INT, Nr6 INT, Nr7 INT)
INSERT INTO @t
VALUES (500, 3, 4, 8, 42, 5, 76, 91)
SELECT AdrNr, a
FROM @t
CROSS APPLY (
VALUES
('Nr1', Nr1),
('Nr2', Nr2),
('Nr3', Nr3),
('Nr4', Nr4),
('Nr5', Nr5),
('Nr6', Nr6),
('Nr7', Nr7)
) t(a, b)
WHERE b = 8
Run Code Online (Sandbox Code Playgroud)
输出 -
AdrNr a
----------- ----
500 Nr3
Run Code Online (Sandbox Code Playgroud)
关于VALUES的帖子:UNPIVOT是将列转换成行的最佳方式吗?
更新(动态SQL):
DECLARE @t TABLE (AdrNr INT, Nr1 INT, Nr2 INT, Nr3 INT, Nr4 INT, Nr5 INT, Nr6 INT, Nr7 INT)
INSERT INTO @t
VALUES
(500, 3, 4, 8, 42, 5, 76, 91),
(501, 3, 8, 8, 42, 5, 76, 91)
IF OBJECT_ID('tempdb.dbo.#tbl') IS NOT NULL
DROP TABLE #tbl
SELECT AdrNr, t.col, t.val
INTO #tbl
FROM @t
CROSS APPLY (
VALUES
('Nr1', Nr1), ('Nr2', Nr2), ('Nr3', Nr3), ('Nr4', Nr4),
('Nr5', Nr5), ('Nr6', Nr6), ('Nr7', Nr7)
) t(col, val)
WHERE val = 8
DECLARE @SQL NVARCHAR(MAX)
SET @SQL = '
SELECT *
FROM #tbl
PIVOT (
MAX(val)
FOR col IN (' + STUFF((
SELECT DISTINCT ', [' + col + ']'
FROM #tbl
FOR XML PATH('')), 1, 2, '') + ')
) p'
EXEC sys.sp_executesql @SQL
Run Code Online (Sandbox Code Playgroud)
输出 -
AdrNr Nr2 Nr3
----------- ----------- ---------
500 NULL 8
501 8 8
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
63 次 |
| 最近记录: |