【问题标题】:Crosstab Queries: using fixed values to create additional columns交叉表查询:使用固定值创建附加列
【发布时间】:2012-09-11 23:45:15
【问题描述】:

有人读过 MSDN 页面上关于使用 TRANSFORM 语句创建交叉表查询的内容吗?

http://msdn.microsoft.com/en-us/library/office/bb208956(v=office.12).aspx

它包括以下断言,代码示例不支持:

您还可以包含不存在数据的固定值以创建其他列。

是的,我想创建一个数据透视表,其中包含来自预先存在的列表的一组固定的有序列标题。这是一个简化的 SQL 查询:

将 SUM(tblData.Losses) 转换为 TotalLosses 选择 tblData.LossType 来自 tblData 按 tblData.Region 分组 PIVOT tblData.Year;

我想添加表格中没有的区域名称,并且我希望这些区域以特定顺序出现。是的,我可以创建一个区域列表表并将其左连接:但这也不会强加任意顺序 - 交叉表查询始终按字母顺序从左到右对列进行排序。

我可能只想添加不存在数据的任意固定值。

这是 MSDN 的信息:

语法

变换聚合函数 选择语句 PIVOT pivotfield [IN (value1[, value2[, …]])]

TRANSFORM 语句包含以下部分:

  • aggfunction:对选定数据进行操作的 SQL 聚合函数。
  • selectstatement:一个 SELECT 语句。
  • pivotfield:要用于在查询结果集中创建列标题的字段或表达式。
  • value1,value2:用于创建列标题的固定值。

...剩下的只是根据教科书数据创建一个普通的数据透视表。

所以,我的问题是:

有没有人实际使用过固定值来创建列标题?

您的 SQL 示例会很有用。


这是关于 Microsoft Access SQL 的已发布语法的问题。

感谢您没有问我为什么要这样做,而是提供冗长的 SQL 示例来回答“是否有 ANSI SQL 可以通过硬编码所有内容来完成 TRANSFORM 语句的功能?”或指出这在大型机上的 Postgres 中会更容易。

【问题讨论】:

    标签: ms-access ms-access-2010


    【解决方案1】:

    是的,我可以在 Access 中使用一组固定的四个值来执行此操作。

    TRANSFORM Sum([Shape_Length]/5280) AS MILES
    SELECT "ONSHORE" AS Type, Sum(qry_CurYrTrans.Miles) AS [Total Of Miles]
    FROM qry_CurYrTrans
    GROUP BY "ONSHORE"
    PIVOT qry_CurYrTrans.QComb IN ('1_HCA_PT','2_HCA_PT','3_HCA_PT','4_HCA_PT'); 
    

    我的结果是:

    | Type     | Total Of Miles  | 1_HCA_PT  | 2_HCA_PT  | 3_HCA_PT  | 4_HCA_PT |
    | ONSHORE  | 31.38           |           | 0.30      | 7.80      |          |
    

    从这个结果,我可以确定几件事:

    • 值“2_HCA_PT”和“3_HCA_PT”确实存在于我来源的 QComb 列中。
    • 值“1_HCA_PT”和“4_HCA_PT”确实存在于我来源的 QComb 列中。
    • 来自我的来源的 QComb 列中有其他值未在 PIVOT 列标题中表示。我可以判断,因为 31.38 > (0.30 + 7.80)。

    【讨论】:

    • 我想知道的是,如何将空值替换为“0”?
    • 如果这是一个问题,您应该将其视为一个新问题吗?
    • 好主意。我已经做了。 (Look here.)
    • EJ Mark - 很好,看来您也得到了答案。 :)
    • 我相信顺序是由它们在IN子句中写入的顺序决定的。所以,如果上面的例子被重写为IN ('4_HCA_PT','3_HCA_PT','2_HCA_PT','1_HCA_PT'),我想你会看到列顺序发生了变化。请注意,您还应该能够通过将列从 IN 子句中排除来排除该列。因此,如果您只想返回两列(并排除所有其他列),您可以编写 IN ('4_HCA_PT','3_HCA_PT)。我不确定这是否是标准 SQL,但我相信它在 MS Access 中是这样工作的。
    【解决方案2】:

    试试这个:

    TRANSFORM Sum(tblData.Losses) AS TotalLosses
    SELECT tblData.Region, tblData.LossType
    FROM tblData
    GROUP BY tblData.Region, tblData.LossType
    PIVOT tblData.Year In ('2001','2000');
    

    关键是 PIVOT 语句中的年份列表。对于日期时间数据类型,您可能必须将 ' 替换为 #。

    【讨论】:

    • 关闭,但没有雪茄:您正在指定 tblData.Year 中可用值的子集 - 不提供任意固定项目的列表。这些不是“不存在数据的固定值”,如果它们不在 tblData 中,它们将不会创建额外的列。
    • 另外...你刚刚从 MSDN 页面上删除了那个 SQL 示例,不是吗?
    • 不。我有类似的情况,但我无法共享代码。假设一年的文本字段,上面编辑的查询对我来说有效。如果您发布表方案,则更容易修复查询。
    猜你喜欢
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 2020-11-10
    • 2010-10-30
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多