在SQL Server中获取一行中的所有记录
我正在编写一个SQL查询来创建这样的计算列:(代码的简化版本) 当我运行此查询时,报告就是这样的。它创建多个行,其中第一个条件用于多个列。如何获取唯一的记录在SQL Server中获取一行中的所有记录,sql,sql-server,Sql,Sql Server,我正在编写一个SQL查询来创建这样的计算列:(代码的简化版本) 当我运行此查询时,报告就是这样的。它创建多个行,其中第一个条件用于多个列。如何获取唯一的记录 CUSTID NAME ADDRESS Col1 Col2 Col3 Col4 Col5 101 Nikh US X X X X X 102 Chris Canada Yes X X X
CUSTID NAME ADDRESS Col1 Col2 Col3 Col4 Col5
101 Nikh US X X X X X
102 Chris Canada Yes X X X X
102 Chris Canada X X Yes X X
103 Todd Japan X X X Yes X
103 Todd Japan X X X X Yes
104 Levis China X X X X X
105 Jack Germany X Yes X X X
105 Jack Germany X X Yes X X
预期结果:
CUSTID NAME ADDRESS Col1 Col2 Col3 Col4 Col5
101 Nikh US X X X X X
102 Chris Canada Yes X Yes X X
103 Todd Japan X X X Yes Yes
104 Levis China X X X X X
105 Jack Germany X Yes Yes X X
使用MAX
:
SELECT CUST_ID,
NAME,
ADDRESS,
MAX(CASE WHEN STIP_ID = 20 AND STATUS = 'OPEN' THEN 'YES' ELSE 'X' END) AS COL1,
MAX(CASE WHEN STIP_ID = 21 AND STATUS = 'OPEN' THEN 'YES' ELSE 'X' END) AS COL2,
MAX(CASE WHEN STIP_ID = 22 AND STATUS = 'OPEN' THEN 'YES' ELSE 'X' END) AS COL3,
MAX(CASE WHEN STIP_ID = 23 AND STATUS = 'OPEN' THEN 'YES' ELSE 'X' END) AS COL4,
MAX(CASE WHEN STIP_ID = 24 AND STATUS = 'OPEN' THEN 'YES' ELSE 'X' END) AS COL5
FROM TABLE1
GROUP BY CUST_ID,
NAME,
ADDRESS
使用MAX
:
SELECT CUST_ID,
NAME,
ADDRESS,
MAX(CASE WHEN STIP_ID = 20 AND STATUS = 'OPEN' THEN 'YES' ELSE 'X' END) AS COL1,
MAX(CASE WHEN STIP_ID = 21 AND STATUS = 'OPEN' THEN 'YES' ELSE 'X' END) AS COL2,
MAX(CASE WHEN STIP_ID = 22 AND STATUS = 'OPEN' THEN 'YES' ELSE 'X' END) AS COL3,
MAX(CASE WHEN STIP_ID = 23 AND STATUS = 'OPEN' THEN 'YES' ELSE 'X' END) AS COL4,
MAX(CASE WHEN STIP_ID = 24 AND STATUS = 'OPEN' THEN 'YES' ELSE 'X' END) AS COL5
FROM TABLE1
GROUP BY CUST_ID,
NAME,
ADDRESS
发布的问题解决方案:
SELECT [CUST_ID],[NAME],[ADDRESS],[20],[21],[22],[23],[24]
FROM TABLE1
CROSS APPLY (SELECT CASE [STATUS] WHEN 'OPEN' THEN 'YES' ELSE 'X' END [YES OR X])
PIVOT(MAX([YES OR X]) FOR [STIP_ID] IN ([20],[21],[22],[23],[24]) ) P
SELECT
[CUST_ID], [NAME], [ADDRESS],
ISNULL([20],'X'), ISNULL([21],'X'), ISNULL([22],'X'), ISNULL([23],'X'), ISNULL([24],'X')
FROM TABLE1
CROSS APPLY (CASE WHEN Stips.StipulationID = 90 AND Stips.StatusID IN (39, 41) THEN '('TR10_Pers_FS_Curr_Signed' + '- ' + Prim.PrimaryCust) ELSE 'X' END) AS TR10_Pers_FS_Curr_Signed)
PIVOT(MAX(TR10_Pers_FS_Curr_Signed) FOR [STIP_ID] IN ([20],[21],[22],[23],[24]) ) P
适应新需求的解决方案:
SELECT [CUST_ID],[NAME],[ADDRESS],[20],[21],[22],[23],[24]
FROM TABLE1
CROSS APPLY (SELECT CASE [STATUS] WHEN 'OPEN' THEN 'YES' ELSE 'X' END [YES OR X])
PIVOT(MAX([YES OR X]) FOR [STIP_ID] IN ([20],[21],[22],[23],[24]) ) P
SELECT
[CUST_ID], [NAME], [ADDRESS],
ISNULL([20],'X'), ISNULL([21],'X'), ISNULL([22],'X'), ISNULL([23],'X'), ISNULL([24],'X')
FROM TABLE1
CROSS APPLY (CASE WHEN Stips.StipulationID = 90 AND Stips.StatusID IN (39, 41) THEN '('TR10_Pers_FS_Curr_Signed' + '- ' + Prim.PrimaryCust) ELSE 'X' END) AS TR10_Pers_FS_Curr_Signed)
PIVOT(MAX(TR10_Pers_FS_Curr_Signed) FOR [STIP_ID] IN ([20],[21],[22],[23],[24]) ) P
发布的问题解决方案:
SELECT [CUST_ID],[NAME],[ADDRESS],[20],[21],[22],[23],[24]
FROM TABLE1
CROSS APPLY (SELECT CASE [STATUS] WHEN 'OPEN' THEN 'YES' ELSE 'X' END [YES OR X])
PIVOT(MAX([YES OR X]) FOR [STIP_ID] IN ([20],[21],[22],[23],[24]) ) P
SELECT
[CUST_ID], [NAME], [ADDRESS],
ISNULL([20],'X'), ISNULL([21],'X'), ISNULL([22],'X'), ISNULL([23],'X'), ISNULL([24],'X')
FROM TABLE1
CROSS APPLY (CASE WHEN Stips.StipulationID = 90 AND Stips.StatusID IN (39, 41) THEN '('TR10_Pers_FS_Curr_Signed' + '- ' + Prim.PrimaryCust) ELSE 'X' END) AS TR10_Pers_FS_Curr_Signed)
PIVOT(MAX(TR10_Pers_FS_Curr_Signed) FOR [STIP_ID] IN ([20],[21],[22],[23],[24]) ) P
适应新需求的解决方案:
SELECT [CUST_ID],[NAME],[ADDRESS],[20],[21],[22],[23],[24]
FROM TABLE1
CROSS APPLY (SELECT CASE [STATUS] WHEN 'OPEN' THEN 'YES' ELSE 'X' END [YES OR X])
PIVOT(MAX([YES OR X]) FOR [STIP_ID] IN ([20],[21],[22],[23],[24]) ) P
SELECT
[CUST_ID], [NAME], [ADDRESS],
ISNULL([20],'X'), ISNULL([21],'X'), ISNULL([22],'X'), ISNULL([23],'X'), ISNULL([24],'X')
FROM TABLE1
CROSS APPLY (CASE WHEN Stips.StipulationID = 90 AND Stips.StatusID IN (39, 41) THEN '('TR10_Pers_FS_Curr_Signed' + '- ' + Prim.PrimaryCust) ELSE 'X' END) AS TR10_Pers_FS_Curr_Signed)
PIVOT(MAX(TR10_Pers_FS_Curr_Signed) FOR [STIP_ID] IN ([20],[21],[22],[23],[24]) ) P
你能提供所需的数据集吗?你说的是将信息汇总到每个客户ID上吗?@Kris你是对的。你能提供所需的数据集吗?你说的是将信息汇总到每个客户ID上吗?@Kris你是对的。有效吗?我们可以从字符串类型参数得到一个MAX函数吗?谢谢,我不知道。这不起作用。它只是删除所有具有重复符的记录。但这不是我想要的。请看你想要的result@user3076028我看到了期望的结果,这应该会给你。如果没有,那么请发布一个SQLFIDLE示例数据,而不是说“这不起作用”。查询不会从您的数据库中删除任何内容table@user3076028除非你改变你的问题。答案符合当前要求,
MIN
适用于您在评论中发布的修改后的问题,是否有效?我们可以从字符串类型参数得到一个MAX函数吗?谢谢,我不知道。这不起作用。它只是删除所有具有重复符的记录。但这不是我想要的。请看你想要的result@user3076028我看到了期望的结果,这应该会给你。如果没有,那么请发布一个SQLFIDLE示例数据,而不是说“这不起作用”。查询不会从您的数据库中删除任何内容table@user3076028除非你改变你的问题。答案符合当前要求,MIN
适用于您在评论中发布的修改后的问题我也喜欢您的答案。但是我的CASE语句
是MIN(当Stips.constrationId=90且Stips.StatusID在(39,41)中时的CASE),然后'('TR10_Pers_FS_Curr_签名'+'-'+Prim.PrimaryCust)或者'X'END)作为TR10_Pers_FS_Curr签名
。你观察到有“是”的字段,在我的实时代码中实际上是一个动态字段。我也喜欢你的答案。但是我的CASE语句
是MIN(当Stips.constrationId=90且Stips.StatusID在(39,41)中时的CASE),然后'('TR10_Pers_FS_Curr_签名'+'-'+Prim.PrimaryCust)或者'X'END)作为TR10_Pers_FS_Curr签名
。你观察到有“是”的字段,在我的实时代码中,它实际上是一个动态字段。