【问题标题】:How to sort a query by a row and add multiple columns如何按行对查询进行排序并添加多列
【发布时间】:2017-09-08 16:40:32
【问题描述】:

我正在查询以获得这些结果:

Concept  | Variety 1  | Variety 2 | Variety 3
-------- | ---------- | --------- | ---------
Stage 1  |   125.23   |  142.32   |  154.00
State 2  |   100.00   |  100.00   |  100.00

我有 2 个数据库来获得这些结果,这个查询给了我这个结果

查询:

SELECT A.Etapa as CEtapa
     , Sum(P.Import) + Sum(P.HExtras) + Sum(P.Importunidades) as Total 
FROM Percepciones as P
   , [\SYS21\Camel\COSTOS.MDB].Lotes as L
   , [\SYS21\Camel\COSTOS.MDB].Actividades as A 
WHERE P.Apl2__ =  L.Numero 
AND P.Apl3__ = A.Numero
GROUP BY A.Etapa
ORDER BY A.Etapa

结果:

Concept  | Variety 1  
-------- | ---------- 
Stage 1  |   125.23   
State 2  |   100.00   

问题是我有 N 数量的品种,我需要查询来做到这一点,我正在使用 .NET 来显示这些结果。所以我想,“为什么不创建一个循环来添加每个品种。”但是,我遇到的问题是它们没有按阶段计算,这是我的测试查询:

SELECT A.Etapa as CEtapa
    ,(SELECT Total 
      FROM (SELECT Sum(P.Import) + Sum(P.HExtras) + Sum(P.Importunidades) as Total 
            FROM Percepciones as P
               , [\SYS21\Camel\COSTOS.MDB].Lotes as L
               , [\SYS21\Camel\COSTOS.MDB].Actividades as A 
            WHERE L.Numero = P.Apl2__
            AND Variedad = L.Variedad
            AND P.Apl3__ = A.Numero
        )
      ) as Variedad1 
FROM Percepciones as P
   , [\SYS21\Camel\COSTOS.MDB].Lotes as L
   , [\SYS21\Camel\COSTOS.MDB].Actividades as A 
WHERE P.Apl2__ =  L.Numero
AND P.Apl3__ = A.Numero 
GROUP BY A.Etapa

我会在 .Net 上循环连接的内容是:

SELECT Total
FROM (SELECT Sum(P.Import) + Sum(P.HExtras) + Sum(P.Importunidades) as Total
      FROM Percepciones as P
         , [\SYS21\Camel\COSTOS.MDB].Lotes as L
         , [\SYS21\Camel\COSTOS.MDB].Actividades as A
      WHERE L.Numero = P.Apl2__ 
      AND Variedad = L.Variedad
      AND P.Apl3__ = A.Numero
     )
 ) as Variedad1 

遗憾的是,这在每个阶段都给了我相同的结果,因为我没有比较 WHERE 子句中的阶段,因为我不知道如何在子查询上使用主查询中的阶段。

任何想法将不胜感激。

【问题讨论】:

  • 我不是专家,但这看起来像是透视查询的工作。
  • 显示示例原始数据。每个阶段可以有多个品种? CROSSTAB 查询需要 3 个字段。可能需要使用 DCount() 为每个阶段组生成序列 ID。该计算字段将是 ColumnHeader。
  • @June7 每个阶段可以有n个品种,也有n个阶段。

标签: sql vb.net ms-access


【解决方案1】:

考虑 MS Access SQL 的独特 crosstab query,它将 TRANSFORMPIVOT 子句包装在聚合 GROUP BY 查询周围,以动态地跨组旋转聚合。

以下按Etapa 分组和枢轴Variedad 聚合您计算的Total 字段。请注意任何查询结果集中 N=255 列的访问限制。此外,下面使用带有INNER JOIN 的显式连接(ANSI '92 标准为 25 年),而不是使用带有 WHERE 子句连接的逗号分隔表的隐式连接。对于多个连接,Access SQL 确实需要括号配对。

TRANSFORM Sum(P.Import) + Sum(P.HExtras) + Sum(P.Importunidades) as Total
SELECT A.Etapa as CEtapa 
FROM (Percepciones as P
INNER JOIN [\SYS21\Camel\COSTOS.MDB].Lotes as L
   ON P.[Apl2__] =  L.[Numero]) 
INNER JOIN [\SYS21\Camel\COSTOS.MDB].Actividades as A 
   ON P.[Apl2__] =  A.[Numero]
GROUP BY A.Etapa
PIVOT L.Variedad

如果您想限制列,请将IN 添加到PIVOT

PIVOT L.Variedad IN ('Variety 1', 'Variety 3', 'Variety 5')

【讨论】:

  • 有(n)个品种和阶段,我设法让它与这个一起工作:SELECT etapa, SUM(iif(variedad=1,p.import + p.importunidades + p.hextras,0)), SUM(iif(variedad=2,p.import + p.importunidades + p.hextras,0)) FROM percepciones AS P, [\SYS21\Camel\COSTOS.MDB].Lotes AS L, [\SYS21\Camel\COSTOS.MDB].Actividades AS A WHERE l.numero =p.apl2__ and a.numero = p.apl3__ GROUP BY etapa我喜欢你的风格,看起来更专业,但当我尝试运行它时它没有工作.
  • 这是在 RDBMS 之间进行数据透视的另一种方法(仅在 Access 中允许交叉表)。而且您仍在使用隐式连接。什么是错误,因为它应该在没有 IN() 的情况下工作,因为正如您现在显示的那样 Variedad 是一个数字而不是字符串,所以请使用 IN(1, 2, ...)
  • 尝试运行查询的问题是查询本身,我得到一个“不支持 JOIN 表达式”,我很抱歉延迟回答,但我很想学习这种方法.谢谢!
  • 哇!我以为你永远离开了。我在第二个ON 子句中使用L 而不是A 别名发现了我的问题。见更新。与其他数据透视表不同,交叉表不需要手动 SUM(IIF(...)) 行,而是跨越列的每个值。
  • 我现在看到了它是如何工作的,它会很有用,因为我已经这样做了好几次了,我一直在寻找一种不在代码中循环 SUM(IIf... 的方法,非常感谢!
猜你喜欢
  • 2019-01-13
  • 1970-01-01
  • 2014-02-04
  • 2016-04-08
  • 2014-04-07
  • 2016-06-07
  • 1970-01-01
  • 1970-01-01
  • 2020-10-22
相关资源
最近更新 更多