Sql server 如何从多个列(在sql中)创建交叉选项卡(在crystal中)
我在SQL中有5列,需要在Crystal中转换为交叉表 这就是我所拥有的:Sql server 如何从多个列(在sql中)创建交叉选项卡(在crystal中),sql-server,crystal-reports,crosstab,Sql Server,Crystal Reports,Crosstab,我在SQL中有5列,需要在Crystal中转换为交叉表 这就是我所拥有的: Key | RELATIONSHIP | DISABLED | LIMITED | RURAL | IMMIGRANT ----------------------------------------------------------------- 1 | Other Dependent | Yes | No | No | No 2 | Victim/Surviv
Key | RELATIONSHIP | DISABLED | LIMITED | RURAL | IMMIGRANT
-----------------------------------------------------------------
1 | Other Dependent | Yes | No | No | No
2 | Victim/Survivor | No | No | No | No
3 | Victim/Survivor | Yes | No | No | No
4 | Child | No | No | No | No
5 | Victim/Survivor | No | No | No | No
6 | Victim/Survivor | No | No | No | No
7 | Child | No | No | No | No
8 | Victim/Survivor | No | Yes | Yes | Yes
9 | Child | No | Yes | Yes | Yes
10 | Child | No | Yes | Yes | Yes
这就是我希望交叉表的外观(键上的不同计数):
我在Crystal中使用了这个公式来组合4列(字段名={@OTHERDEMO})
…然后以@OTHERDEMO作为行,以RELATIONSHIP作为列,在键上使用不同的计数进行交叉制表:
问题是,一旦crystal点击第一个“是”,它就会停止计数,从而无法在交叉表中正确分类。所以我得到了一个表,它首先计算残疾并给出正确的显示,然后计算有限的残疾并给出一些信息,然后转储所有其他信息
在过去,我做过多个条件公式
IF {TABLE.DISABLED} = "YES" AND {TABLE.RELATIONSHIP} = "Victim/Survivor" THEN {TABLE.KEY} ELSE {@NULL}
(the @null formula is because Crystal, notoriously, gets confused with nulls.)
…然后对键进行不同的计数,最后在页脚处求和
我相信还有另一种方法可以做到这一点。任何帮助/想法都将不胜感激。如果您将这些“演示”列解压成行,将使交叉表变得非常简单
select
u.[Key],
u.[RELATIONSHIP],
u.[DEMO]
from
Table1
unpivot (
[b] for [DEMO] in ([DISABLED], [LIMITED], [RURAL], [IMMIGRANT])
) u
where
u.[b] = 'Yes'
或者,如果您停留在SQL2000兼容级别上,您可以手动取消选择“是”值
select [Key], [REALTIONSHIP], [DEMO] = cast('DISABLED' as varchar(20))
from Table1
where [DISABLED] = 'Yes'
union
select [Key], [REALTIONSHIP], [DEMO] = cast('LIMITED' as varchar(20))
from Table1
where [LIMITED] = 'Yes'
union
select [Key], [REALTIONSHIP], [DEMO] = cast('RURAL' as varchar(20))
from Table1
where [RURAL] = 'Yes'
union
select [Key], [REALTIONSHIP], [DEMO] = cast('IMMIGRANT' as varchar(20))
from Table1
where [IMMIGRANT] = 'Yes'
对于交叉表,在键列上使用计数(也称为行计数),[DEMO]在行上使用计数,而[RELATIONSHIP]在列上使用计数。允许您更改查询/数据源吗?哦!美好的这太完美了。我以前从未遇到过“unpivot”。感谢更新Welp,进入那里,发现由于我们的一些系统需求,兼容性模式被设置为SQL2000。苏呜。。。。看来我得走很长的路/叹息
select
u.[Key],
u.[RELATIONSHIP],
u.[DEMO]
from
Table1
unpivot (
[b] for [DEMO] in ([DISABLED], [LIMITED], [RURAL], [IMMIGRANT])
) u
where
u.[b] = 'Yes'
select [Key], [REALTIONSHIP], [DEMO] = cast('DISABLED' as varchar(20))
from Table1
where [DISABLED] = 'Yes'
union
select [Key], [REALTIONSHIP], [DEMO] = cast('LIMITED' as varchar(20))
from Table1
where [LIMITED] = 'Yes'
union
select [Key], [REALTIONSHIP], [DEMO] = cast('RURAL' as varchar(20))
from Table1
where [RURAL] = 'Yes'
union
select [Key], [REALTIONSHIP], [DEMO] = cast('IMMIGRANT' as varchar(20))
from Table1
where [IMMIGRANT] = 'Yes'