如何从多个列(在 sql 中)创建交叉表(在 crystal 中)
How to create a cross tab (in crystal) from multiple columns (in sql)
我在 SQL 中有 5 列需要在 Crystal 中变成交叉表。
这是我的:
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
这就是我希望交叉表的样子(键上的不同计数):
| Victim/Survivor | Child | Other Dependent | Total |
--------------------------------------------------------------
| DISABLED | 1 | 0 | 1 | 2 |
--------------------------------------------------------------
| LIMITED | 1 | 2 | 0 | 3 |
--------------------------------------------------------------
| RURAL | 1 | 2 | 0 | 3 |
--------------------------------------------------------------
| IMMIGRANT | 1 | 2 | 0 | 3 |
--------------------------------------------------------------
| TOTAL | 4 | 6 | 1 | 11 |
--------------------------------------------------------------
我在 Crystal 中使用了这个公式来合并 4 列(字段名称 = {@OTHERDEMO})...
IF {TABLE.DISABLED} = "YES" THEN "DISABLED" ELSE
IF {TABLE.LIMITED} = "YES" THEN "LIMITED" ELSE
IF {TABLE.IMMIGRANT} = "YES" THEN "IMMIGRANT" ELSE
IF {TABLE.RURAL} = "YES" THEN "RURAL"
...然后用@OTHERDEMO 作为行,RELATIONSHIP 作为列,在 KEY 上有不同的计数:
问题是,一旦 crystal 命中第一个 "Yes",它就会停止计数,因此无法在交叉表中正确分类。所以我得到一个 table,它首先计算 DISABILITY 并给出正确的显示,然后计算 Limited 并提供一些信息,然后转储所有其他内容。
以前做过多个条件公式...
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.)
...然后对Key进行了不同的计数,最后在页脚中求和。
我相信还有另一种方法可以做到这一点。任何 help/ideas 将不胜感激。
如果您将那些 "DEMO" 列逆透视为行,这将使交叉表变得非常容易...
select
u.[Key],
u.[RELATIONSHIP],
u.[DEMO]
from
Table1
unpivot (
[b] for [DEMO] in ([DISABLED], [LIMITED], [RURAL], [IMMIGRANT])
) u
where
u.[b] = 'Yes'
或者,如果您停留在 SQL2000 兼容级别,您可以手动反转 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'
对于交叉表,在键列上使用计数(也称为行计数),在行上使用 [DEMO],在列上使用 [RELATIONSHIP]。
我在 SQL 中有 5 列需要在 Crystal 中变成交叉表。
这是我的:
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
这就是我希望交叉表的样子(键上的不同计数):
| Victim/Survivor | Child | Other Dependent | Total |
--------------------------------------------------------------
| DISABLED | 1 | 0 | 1 | 2 |
--------------------------------------------------------------
| LIMITED | 1 | 2 | 0 | 3 |
--------------------------------------------------------------
| RURAL | 1 | 2 | 0 | 3 |
--------------------------------------------------------------
| IMMIGRANT | 1 | 2 | 0 | 3 |
--------------------------------------------------------------
| TOTAL | 4 | 6 | 1 | 11 |
--------------------------------------------------------------
我在 Crystal 中使用了这个公式来合并 4 列(字段名称 = {@OTHERDEMO})...
IF {TABLE.DISABLED} = "YES" THEN "DISABLED" ELSE
IF {TABLE.LIMITED} = "YES" THEN "LIMITED" ELSE
IF {TABLE.IMMIGRANT} = "YES" THEN "IMMIGRANT" ELSE
IF {TABLE.RURAL} = "YES" THEN "RURAL"
...然后用@OTHERDEMO 作为行,RELATIONSHIP 作为列,在 KEY 上有不同的计数:
问题是,一旦 crystal 命中第一个 "Yes",它就会停止计数,因此无法在交叉表中正确分类。所以我得到一个 table,它首先计算 DISABILITY 并给出正确的显示,然后计算 Limited 并提供一些信息,然后转储所有其他内容。
以前做过多个条件公式...
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.)
...然后对Key进行了不同的计数,最后在页脚中求和。
我相信还有另一种方法可以做到这一点。任何 help/ideas 将不胜感激。
如果您将那些 "DEMO" 列逆透视为行,这将使交叉表变得非常容易...
select
u.[Key],
u.[RELATIONSHIP],
u.[DEMO]
from
Table1
unpivot (
[b] for [DEMO] in ([DISABLED], [LIMITED], [RURAL], [IMMIGRANT])
) u
where
u.[b] = 'Yes'
或者,如果您停留在 SQL2000 兼容级别,您可以手动反转 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'
对于交叉表,在键列上使用计数(也称为行计数),在行上使用 [DEMO],在列上使用 [RELATIONSHIP]。