【问题标题】:Dividing values of two SQL crosstabs将两个 SQL 交叉表的值相除
【发布时间】:2012-01-11 17:33:14
【问题描述】:

我想创建两个交叉表,然后将两者的比率取一个百分比。第一个看起来像这样:

TRANSFORM Count([Deal Data ECM].[Fees (Y/N)]) AS [CountOfFees (Y/N)]
SELECT [Deal Data ECM].[Deal Type]
FROM [Deal Data ECM]
WHERE ((([Deal Data ECM].[Fees (Y/N)])="Y"))
GROUP BY [Deal Data ECM].[Deal Type]
PIVOT [Deal Data ECM].[Deal Region];

并且第二个应该具有相同的一切,除了费用(Y/N)将设置为“N”。然后我想在每个表中划分相应的值。有没有办法在一个 SQL 表达式中做到这一点?

编辑:

假设query1和2的结果如下:

Query1
    Blue  Red
Cat  1     2
Dog  3     4

Query2
    Blue  Red
Cat  5     10
Dog  15    20

I want Query 3 to result in:

Query3
    Blue  Red
Cat  .5    .5
Dog  .5    .5

编辑 2:这就是数据的样子。更具体地说,每个查询的结果如下所示:

          Region1 Region2 Region3
Dealtype1 some numbers in each of these cells
Dealtype2
Dealtype3

我不知道你为什么需要实际数据,上面的例子和这个有相同的解决方案(我只是想知道语法,使用什么 SQL 语句等)

解决方案:

TRANSFORM Sum(IIf([Disclosed Fees (Y/N)]="Y",1,0))/Count([Disclosed Fees (Y/N)]) AS percent_fees_disclosed
SELECT [Deal Data ECM].[Deal Type]
FROM [Deal Data ECM]
GROUP BY [Deal Data ECM].[Deal Type]
PIVOT [Deal Data ECM].[Deal Region];

【问题讨论】:

  • 让我们不要想象任何这样的事情。这不是交叉表的结果。如果您无法使用查询设计窗口解决此问题并且不希望提供实际样本数据,请创建一个虚拟表和两个交叉表并粘贴其中的结果。
  • 您忽略了重点,包含 cat, dog 的列是什么?您需要加入此列,因此上面的评论。
  • 此外,如果您使用查询设计窗口和两个简单​​的交叉表,您将了解更多关于整个事情如何工作的信息,如下所述。
  • 见上面的编辑。我不在设计视图中这样做的原因是因为最终我希望它是自动化的(我不想让 3 个单独的查询弄乱我的查询),所以我想让所有这些查询的 SQL 都下来。我认为您在设计视图中一次只能执行一个查询。
  • 好的。我无法解释。您必须将查询 1 与列上的查询 2 连接起来。您不能将交叉表作为子查询,但您可以使用两个交叉表查询来创建第三个查询,以连接公共列上的两个交叉表查询。虽然您可以在 VBA 中创建这些查询,但您必须创建至少两个查询,即使用 createqdf。我经常这样做,我发现创建三个查询很有用,继续...

标签: sql ms-access count crosstab


【解决方案1】:

您可以基于按交易类型连接的两个交叉表创建第三个查询。

在查询设计窗口中,创建Query1:

TRANSFORM Count([Deal Data ECM].[Fees (Y/N)]) AS [CountOfFees1]
SELECT [Deal Data ECM].[Deal Type]
FROM [Deal Data ECM]
WHERE ((([Deal Data ECM].[Fees (Y/N)])="Y"))
GROUP BY [Deal Data ECM].[Deal Type]
PIVOT [Deal Data ECM].[Deal Region];

接下来,创建 Query2:

TRANSFORM Count([Deal Data ECM].[Fees (Y/N)]) AS [CountOfFees2]
SELECT [Deal Data ECM].[Deal Type]
FROM [Deal Data ECM]
WHERE ((([Deal Data ECM].[Fees (Y/N)])="N"))
GROUP BY [Deal Data ECM].[Deal Type]
PIVOT [Deal Data ECM].[Deal Region];

最后,创建 Query3:

SELECT Query1.[DealRegion1], Query2.[DealRegion1], 
       Query2.[DealRegion2], Query1.[DealRegion2]
FROM Query1 
INNER JOIN Query2 
ON Query1.[Deal Type] = Query2.[Deal Type];

您可以将字段从一个表或查询拖到下一个以创建连接。 INNER JOIN 只包括两个字段都匹配的记录。

更多信息:

Fundamentals of Relational Database Design, Paul Litwin, 2003

Fundamental Microsoft Jet SQL for Access 2000
Intermediate Microsoft Jet SQL for Access 2000
Advanced Microsoft Jet SQL for Access 2000

【讨论】:

  • 你认为你可以解释(或链接到它解释的地方)究竟如何做到这一点?我对 sql 很陌生。
  • 好的,一些 sql 和一些注释。不要忘记 MS Office 产品的优势之一是它们的交互性相当好,因此您可以通过 Access 轻松使用 Excel。
  • 再次感谢,但我仍然很困惑.. 没有 DealRegion1 和 DealRegion2,只有一个 DealRegion。想象第一个查询产生的表中的条目 1,1 是 5,而第二个查询产生的表中的条目 1,1 是 10,我希望我的结果是 0.5(5/10)。
  • 我看不到你的交叉表的结果,所以我能做的就是给你一个例子。当您加入两个交叉表共有的字段时,您应该通过拖动或双击将各个字段放入查询设计网格中。 DealRegion1 和 DealRegion2 只是我对您拥有的任何交易区域的猜测。当您将交叉表添加到查询设计窗口时,您应该会明白这一切。
  • 我仍在尝试仅在 SQL 中执行此操作,因为设计视图不适合我。我只是不确定在联接中会在哪里进行划分——一个我有两个结果数据透视表,我如何将第一个中的每个元素除以第二个中的相应元素?
猜你喜欢
  • 2016-05-30
  • 1970-01-01
  • 2012-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-12
相关资源
最近更新 更多