【问题标题】:Using a concatenated value to find the average使用连接值求平均值
【发布时间】:2014-07-15 11:46:01
【问题描述】:

我正在使用 sql server 2008 并连接了许多列以生成一个值。但是,我想汇总所有唯一交易的平均交易成本。

Concatenated values = 
SELECT TOP 10 RTRIM(RTRIM(CAST(CENTER_NBR AS CHAR)) + CAST(DATEDIFF(ss, '19700101', SALES_DATE) AS CHAR(10)) + 
RTRIM(CAST(REGISTER_NBR AS CHAR)) + RTRIM(CAST(TRANSACTION_NBR AS CHAR)) + CAST(BUSINESS_ENTITY AS CHAR))  AS 'TRANS_KEY'
FROM dh_Transaction_Items;

需要找到以下内容:

ROUND(AVG(CAST(ITEM_QTY AS FLOAT)), 3) AS 'AVG ITEM QTY', 
ROUND(AVG(CAST(EXTENDED_PURCHASE_AMT AS FLOAT)), 3) AS 'AVG PURCHASE AMT',
ROUND(AVG(CAST(EXTENDED_SAVINGS_AMT AS FLOAT)), 3) AS 'AVG SAVINGS AMT',
ROUND(AVG(CAST(EXTENDED_COST_AMT AS FLOAT)), 3) AS 'AVG COST AMT',
ROUND(AVG(CAST(EXTENDED_MARGIN_AMT AS FLOAT)), 3) AS 'AVG MARGIN AMT'

基本上,如何将两组sql代码整合起来得到平均值。

编辑:

我想找到整个表中五列的平均值(1+ 百万行)。连接某些列的原因是因为这就是“所需的”唯一标识符。因此,AVG 应将每个“TRANS_KEY”的购买金额相加,然后除以价值总数(超过 100 万)。

【问题讨论】:

  • 您将它们相加并除以 5。如果这不是您想要的,请更好地解释您真正想要的。样本数据和期望的结果真的很有帮助。

标签: sql sql-server


【解决方案1】:

您需要一个 GROUP BY 子句来获取每个组的聚合

SELECT
  RTRIM(RTRIM(CAST(CENTER_NBR AS CHAR)) + CAST(DATEDIFF(ss, '19700101', SALES_DATE) AS CHAR(10)) + 
RTRIM(CAST(REGISTER_NBR AS CHAR)) + RTRIM(CAST(TRANSACTION_NBR AS CHAR)) + CAST(BUSINESS_ENTITY AS CHAR))  AS 'TRANS_KEY'
 ,ROUND(AVG(CAST(ITEM_QTY AS FLOAT)), 3) AS 'AVG ITEM QTY', 
 ,ROUND(AVG(CAST(EXTENDED_PURCHASE_AMT AS FLOAT)), 3) AS 'AVG PURCHASE AMT',
 ,ROUND(AVG(CAST(EXTENDED_SAVINGS_AMT AS FLOAT)), 3) AS 'AVG SAVINGS AMT',
 ,ROUND(AVG(CAST(EXTENDED_COST_AMT AS FLOAT)), 3) AS 'AVG COST AMT',
 ,ROUND(AVG(CAST(EXTENDED_MARGIN_AMT AS FLOAT)), 3) AS 'AVG MARGIN AMT'
FROM dh_Transaction_Items
GROUP BY CENTER_NBR, SALES_DATE, REGISTER_NBR, TRANSACTION_NBR, BUSINESS_ENTITY;

【讨论】:

    【解决方案2】:

    您可以先选择不同的交易,然后将qty / amt之和除以唯一交易的数量来计算平均值,如下所示:

    WITH distinct_transactions AS
    (
        SELECT
        DISTINCT 
    RTRIM(RTRIM(CAST(CENTER_NBR AS CHAR)) + CAST(DATEDIFF(ss, '19700101', SALES_DATE) AS CHAR(10)) + 
        RTRIM(CAST(REGISTER_NBR AS CHAR)) + RTRIM(CAST(TRANSACTION_NBR AS CHAR)) + CAST(BUSINESS_ENTITY AS CHAR)) AS TRANS_KEY
        CAST(ITEM_QTY AS FLOAT) AS ITEM QTY, 
        CAST(EXTENDED_PURCHASE_AMT AS FLOAT) AS PURCHASE AMT,
        CAST(EXTENDED_SAVINGS_AMT AS FLOAT) AS SAVINGS AMT,
        CAST(EXTENDED_COST_AMT AS FLOAT) AS COST AMT,
        CAST(EXTENDED_MARGIN_AMT AS FLOAT) AS MARGIN AMT
        FROM dh_Transaction_Items
    )
    SELECT
        ROUND((SUM(ITEM_QTY) / COUNT(TRANS_KEY)), 3) AS AVG_ITEM_QTY,
        ROUND((SUM(PURCHASE_AMT) / COUNT(TRANS_KEY)), 3) AS AVG_PURCHASE AMT,
        ROUND((SUM(SAVINGS_AMT) / COUNT(TRANS_KEY)), 3) AS AVG_SAVINGS AMT,
        ROUND((SUM(COST_AMT) / COUNT(TRANS_KEY)), 3) AS AVG_COST AMT,
        ROUND((SUM(MARGIN_AMT) / COUNT(TRANS_KEY)), 3) AS AVG_MARGIN AMT
    FROM distinct_transactions;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 2012-10-30
      • 2014-07-02
      • 2015-01-29
      • 2019-02-27
      • 1970-01-01
      相关资源
      最近更新 更多