原谅标题我似乎无法弄清楚我能做些什么。我有一个MainTable
,其中有一些列在另一个表DefTable
简化,因为此列从Col1
运行到Col99
MainTable
RowId Col1 Col2 Col3 Col4
----- ---- ---- ---- ----
1 Y N N N
2 N Y N N
3 N N N Y
DefTable
Key Description
--- -----------
1 Logistics
2 Warehouse
3 Packaging
4 MainLobby
条件是:
如果列标记为Y
,我应根据Description
DefTable
此外,我正在调查两个或更多列的可能性被勾选Y
。如果发生这种情况我应该Concatenate
Logistics, MainLobby
预期输出
RowId Description
----- -----------
1 Logistics
2 Warehouse
3 MainLobby
多个勾选列的可能性
RowId Description
----- -----------
1 Warehouse, MainLobby
我一直在修补answer,但我仍然陷入困境。请帮帮我。
答案 0 :(得分:2)
您可以使用Apply
运算符(即CROSS APPLY
)
SELECT a.RowId, d.Description
FROM MainTable t
CROSS APPLY (
VALUES (t.RowId, 1, t.Col1), (t.RowId, 2, t.Col2),
(t.RowId, 3, t.Col3), (t.RowId, 4, t.Col4)
....
)a(RowId, Id, Cols)
INNER JOIN DefTable d ON d.[Key] = a.Id
WHERE a.Cols = 'Y'
答案 1 :(得分:1)
我想这就是你要找的东西。
您的数据如下:
MainTable
SELECT * INTO #MainTable FROM (
VALUES(1,'Y','N','N','N'),
(2,'N','Y','N','N'),
(3,'N','N','N','Y')
) AS A(RowId ,Col1 ,Col2 ,Col3 ,Col4)
<强> DefTable 强>
SELECT * INTO #DefTable FROM (
VALUES(1,'Logistics'),
(2,'Warehouse'),
(3,'Packaging'),
(4,'MainLobby')
)AS A([Key],[Description])
<强>查询:强>
SELECT M.RowId ,
CASE WHEN (Col1='Y' OR Col2='Y' OR Col3='Y' OR Col4='Y' )THEN D.Description ELSE '' END AS [Description]
FROM #MainTable M
INNER JOIN #DefTable D ON D.[Key]=M.RowId
动态方法:
DECLARE @QUERY NVARCHAR(MAX),@COLUMNSQUERY NVARCHAR(MAX)
SET @COLUMNSQUERY=(SELECT 'CASE '+(SELECT 'WHEN '+COLUMN_NAME +'=''Y'' THEN [DESCRIPTION] '
FROM [tempdb].INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME like '#MainTable%'
and COLUMN_NAME <>'RowId' for xml path('') ) + 'ELSE '''' END AS [DESCRIPTION]' )
SET @QUERY=' SELECT M.RowId ,'+@COLUMNSQUERY + 'FROM #MainTable M
INNER JOIN #DefTable D ON D.[Key]=M.RowId'
EXEC (@QUERY)
注意:我从Temp db中选择了临时表的列。请将其替换为主表存在的实际数据库
使用此 FROM [tempdb].INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME like '#MainTable%'
FROM [YourDatabaseName].INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME like 'Your Main table Name%'