【问题标题】:Need to pivot or crosstab a table but not in the conventional way. please需要对表格进行透视或交叉制表,但不是以传统方式。请
【发布时间】:2012-02-03 18:28:07
【问题描述】:

我这里有个小情况..希望你们能帮帮我。

我应该查询一个有 4 列的表
AccountNo, ResourceNo, ProductNo, CustomerNo.
一些 accountNo 有 2 个 ResourceNo(115 和 134)

我必须以这样一种方式查询它,即我必须为 resourceNo 值显示两个动态列,并在具有 ResourceNoaccountNo 上放置一个“X”。这样AccountNo 没有重复。在这种情况下,旋转没有帮助。请调查一下并帮助我。

另见

Poor Man's SQL Pivot.

另见

Sql Pivot Query with Dynamic Columns

【问题讨论】:

标签: tsql pivot crosstab


【解决方案1】:

你需要穷人的支点:

静态列

例如:

select 
    AccountNo,
    case when sum(case when ResourceNo = 134 then 1 else 0 end) = 0 then '' else 'X' end as Resource_134,
    case when sum(case when ResourceNo = 115 then 1 else 0 end) = 0 then '' else 'X' end as Resource_115
from 
    AccountResource 
group by
    AccountNo

示例数据:

AccountNo ResourceNo ProductNo CustomerNo
A1        134        P1         C1
A1        134        P2         C1
A1        134        P3         C2
A2        134        P1         C1
A2        115        P1         C4
A2        115        P2         C1
A3        115        P5         C2

示例输出:

AccountNo Resource_134 Resource_115
A1        X
A2        X            X
A3                     X

动态列

对于动态列,您可以这样做:

declare @sql nvarchar(max)
set @sql = ''
select @sql = @sql + ',' + char(13)+char(10)+
'case when sum(case when ResourceNo = ''' + replace(cast(ResourceNo as nvarchar(10)), '''', '''''') + ''' then 1 else 0 end) = 0 then '''' else ''X'' end as "Resource_' + replace(cast(ResourceNo as nvarchar(10)), '"', '""') + '"'
from AccountResource 
group by ResourceNo
order by Resourceno

set @sql = 'select AccountNo' + @sql
+ char(13)+char(10)
+ 'From AccountResource '
+ char(13)+char(10)
+ 'group by AccountNo'
+ char(13)+char(10)
+ 'order by AccountNo'
select * from datacheck.dbo.splitmax(@sql, null,null)

exec sp_executesql @sql

【讨论】:

    猜你喜欢
    • 2019-08-06
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 2011-10-28
    相关资源
    最近更新 更多