Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何从多个列(在sql中)创建交叉选项卡(在crystal中)_Sql Server_Crystal Reports_Crosstab - Fatal编程技术网

Sql server 如何从多个列(在sql中)创建交叉选项卡(在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

我在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
这就是我希望交叉表的外观(键上的不同计数):

我在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'