需要一个简单的T-SQL查询吗
我有下表:需要一个简单的T-SQL查询吗,sql,sql-server,sql-server-2008,sql-server-2012,Sql,Sql Server,Sql Server 2008,Sql Server 2012,我有下表: PrimaryKeyColumn1 |PrimaryKeyColumn2 | Column_A | Column_B | Column_C| ID1 Key1 0 1 0 ID2 Key2 1 0 1 ID3 Key
PrimaryKeyColumn1 |PrimaryKeyColumn2 | Column_A | Column_B | Column_C|
ID1 Key1 0 1 0
ID2 Key2 1 0 1
ID3 Key3 1 1 0
基本上,我需要找出一个T-SQL查询来获得如下结果:
ID1 Key1 B
ID2 Key2 A,C
ID3 Key3 A,B
有人能帮我弄清楚吗?列名包括列名末尾下划线后的字母A、b、c…z。0或1表示该字母是否适用于ID。如果0表示否,如果1表示是。因此,如果id为1,则它需要位于结果中id的旁边,否则如果id为0,则不需要
谢谢大家! 试试这种未经测试的方法
;with cte as
(
select *
from yourtable
cross apply (values ('A',ColumnA),
('B',ColumnB),
('C',ColumnC)) CS (name,value)
Where cs.value <> 0
)
SELECT a.PrimaryKeyColumn,
LEFT(cs.result, Len(cs.result) - 1) AS result
FROM cte a
CROSS APPLY (SELECT value + ','
FROM cte B
WHERE a.PrimaryKeyColumn = b.PrimaryKeyColumn
FOR XML PATH('')) cs (result)
GROUP BY a.PrimaryKeyColumn,
LEFT(cs.result, Len(cs.result) - 1)
我认为最简单的方法就是使用用例和一些字符串逻辑:
select PrimaryKeyColumn1, PrimaryKeyColumn2,
stuff(((case when column_a = 1 then ',A' else '' end) +
(case when column_b = 1 then ',B' else '' end) +
(case when column_c = 1 then ',C' else '' end)
), 1, 1, '') as vals
from . . .
我做过类似的事情
CREATE TABLE #test
(
primaryKey nvarchar(150)
, columnA bit
, columnB bit
, columnC bit
) -- create some test table
INSERT INTO #test
VALUES
('ID1',1,0,0)
,('ID2',1,1,0)
,('ID3',1,0,1) -- as well as the test values
SELECT
*
into #tmpUnpiv
FROM #test
UNPIVOT
(
truefalse
for columnName in (columnA, columnB, columnC)
) unpiv; -- save the un-pivoted result as new table #tmpUnpiv
SELECT
DISTINCT
primaryKey + ' ' + (SELECT replace(columnName,'column','') + ',' AS [text()] from #tmpUnPiv WHERE primaryKey = p.primaryKey AND truefalse = 1 FOR XML PATH(''))
FROM #tmpUnPiv p -- then combine results through XML PATH
DROP TABLE #tmpUnPiv
DROP TABLE #test
-- drop temp tables
对不起,我忘了,有复合钥匙。所以我的表中有PrimaryKeyColumn1和PrimaryKeyColumn2。@user3314399-那么您需要将其添加到交叉应用中,其中的子句是什么?交叉应用是什么?我修改了桌子。你能看一下吗戈登的答案是一个简单得多的方法,特别是当你不知道交叉申请的情况下。这是值得学习的,但对于这样一个简单的结果来说可能有些过分。谢谢,它在关键字“values”附近显示了不正确的语法。只需将值更改为您喜欢的列别名即可。值是一个关键字/保留字。也可以用引号或大括号括起来。