Sql 我可以在Access中将虚拟行添加到交叉表查询中吗

Sql 我可以在Access中将虚拟行添加到交叉表查询中吗,sql,ms-access,pivot,crosstab,Sql,Ms Access,Pivot,Crosstab,当源表/查询中不存在数据时,是否可以向交叉表查询添加虚拟行标题?我想指出的是,我知道存在一个类别,即使目前没有任何东西属于该类别 为了举例说明,我想把这个输出 | Category | Total | Class 1 | Class 2 | Class 3 | Class 4 | | PARTK2130 | 0.10 | 0.00 | 0.00 | 0.10 | 0.00 | | PARTK3140 | 0.29 | 0.01

当源表/查询中不存在数据时,是否可以向交叉表查询添加虚拟行标题?我想指出的是,我知道存在一个类别,即使目前没有任何东西属于该类别

为了举例说明,我想把这个输出

| Category    | Total  | Class 1 | Class 2   | Class 3  | Class 4  |
| PARTK2130   |  0.10  | 0.00    |  0.00     |  0.10    | 0.00     |
| PARTK3140   |  0.29  | 0.01    |  0.24     |  0.04    | 0.00     |
| PARTK4150   | 30.98  | 0.33    | 12.22     | 18.44    | 0.00     |
让它看起来像这样(注意*新*行)

我能想到的唯一方法是创建一个新的虚拟源表/查询,用一些虚拟记录填充它,然后将交叉表查询修改为一个联合查询,该查询与原始源一起查看这个虚拟源。我让它工作了,但这似乎是一个很大的骗局

事实上,我学习了如何在没有数据的情况下添加额外的列(参见Class 4列和),因此我认为添加额外的行也是一个技巧。希望如此

下面是SQL:

TRANSFORM Format(Nz(Sum(qryPartK.MILES_OF_PHYS_LENGTH),0),"Fixed") 
AS SumOfMILES_OF_PHYS_LENGTH
SELECT IIf([PCT_SMYS]<=30,"PARTK2130",
IIf([PCT_SMYS]<=40,"PARTK3140", IIf([PCT_SMYS]<=50,"PARTK4150",
IIf([PCT_SMYS]<=60,"PARTK5160",IIf([PCT_SMYS]<=72,"PARTK6170",
IIf([PCT_SMYS]>72 And [PCT_SMYS]>=80,"PARTK7180",
IIf([PCT_SMYS]>80,"PARTK80MORE"))))))) AS Category, 
Sum(qryPartK.MILES_OF_PHYS_LENGTH) AS Total
FROM qryPartK
GROUP BY IIf([PCT_SMYS]<=30,"PARTK2130",
IIf([PCT_SMYS]<=40,"PARTK3140",IIf([PCT_SMYS]<=50,"PARTK4150",
IIf([PCT_SMYS]<=60,"PARTK5160",IIf([PCT_SMYS]<=72,"PARTK6170",
IIf([PCT_SMYS]>72 And [PCT_SMYS]>=80,"PARTK7180",
IIf([PCT_SMYS]>80,"PARTK80MORE")))))))
PIVOT qryPartK.CLASS_LOC_text In ("Class 1","Class 2","Class 3","Class 4");
转换格式(Nz(和(物理长度的qryPartK.MILES),0),“固定”)
作为物理长度的总和

选择IIf([PCT\U SMYS]UNION使您的数据不同。如果类别不同,它将显示在结果中。如果只返回带值的行,则必须添加
,其中总计0

编辑

转换格式(Nz(和(物理长度的qryPartK.MILES),0),“固定”)
作为物理长度的总和

选择IIf([PCT_SMYS]使用带有子查询的
外部联接:

select c.category, r.total, r.class1, r.class2, r.class3, r.class4
from (select 'PARTK1120' category 
      union all select 'PARTK2130'
      union all select 'PARTK3140'
      union all select 'PARTK4150'
      union all select 'PARTK5160'
      union all select 'PARTK6170'
      union all select 'PARTK7180') c 
left join yourresults r on c.category = r.category

您可以使用
coalesce
null
值转换为
0
coalesce(r.total,0)total

您是否有一个包含要显示的不同类别的类别表?如果有,请研究使用
外部联接。不,我没有。如果有,您能解释一下我将如何使用它来解决我的问题吗?或者如果total不是所有类的总和,您应该添加
其中total 0和[Class 1]0
等。我没有完全理解,但我目前也没有使用联合查询。事实上,我希望避免使用联合查询。请编写查询,这会很有帮助。没有。错误消息:“不能有聚合函数WHERE子句(Sum(qryPartK.MILES\u OF_PHYS\u LENGTH)0)。”我对此很感兴趣,但您的代码似乎与Access SQL方言不兼容。如果有办法对其进行调整,我将有兴趣了解如何进行调整。
TRANSFORM Format(Nz(Sum(qryPartK.MILES_OF_PHYS_LENGTH),0),"Fixed") 
AS SumOfMILES_OF_PHYS_LENGTH
SELECT IIf([PCT_SMYS]<=30,"PARTK2130",
IIf([PCT_SMYS]<=40,"PARTK3140", IIf([PCT_SMYS]<=50,"PARTK4150",
IIf([PCT_SMYS]<=60,"PARTK5160",IIf([PCT_SMYS]<=72,"PARTK6170",
IIf([PCT_SMYS]>72 And [PCT_SMYS]>=80,"PARTK7180",
IIf([PCT_SMYS]>80,"PARTK80MORE"))))))) AS Category, 
Sum(qryPartK.MILES_OF_PHYS_LENGTH) AS Total
FROM qryPartK

WHERE Sum(qryPartK.MILES_OF_PHYS_LENGTH)<>0

GROUP BY IIf([PCT_SMYS]<=30,"PARTK2130",
IIf([PCT_SMYS]<=40,"PARTK3140",IIf([PCT_SMYS]<=50,"PARTK4150",
IIf([PCT_SMYS]<=60,"PARTK5160",IIf([PCT_SMYS]<=72,"PARTK6170",
IIf([PCT_SMYS]>72 And [PCT_SMYS]>=80,"PARTK7180",
IIf([PCT_SMYS]>80,"PARTK80MORE")))))))
PIVOT qryPartK.CLASS_LOC_text In ("Class 1","Class 2","Class 3","Class 4");
select c.category, r.total, r.class1, r.class2, r.class3, r.class4
from (select 'PARTK1120' category 
      union all select 'PARTK2130'
      union all select 'PARTK3140'
      union all select 'PARTK4150'
      union all select 'PARTK5160'
      union all select 'PARTK6170'
      union all select 'PARTK7180') c 
left join yourresults r on c.category = r.category