繁体   English   中英

计算SQL百分比

[英]Calculate percentage in SQL

我正在尝试使用另一个表创建表(列),但是在获取所需的列时遇到了麻烦。 请指导。

表名称:交易,客户,Prod_cat_info

SELECT DISTINCT T.cust_id, 
                c.gender, 
                C.city_code, 
                Datediff(mm, c.dob, Getdate())             AS AGE_IN_MONTHS, 
                (SELECT Count(transaction_id) 
                 FROM   transactions 
                 GROUP  BY tran_date)                      AS 
                basket_count_per_day, 
                (SELECT Sum(total_amt) 
                 FROM   transactions)                      AS Tot_sal_amt, 
                (SELECT Sum(qty) 
                 FROM   transactions)                      AS tot_sal_qnty, 
                (SELECT Count(DISTINCT prod_cat) 
                 FROM   dbo.prod_cat_info)                 AS Unq_cat_cnt, 
                (SELECT DISTINCT prod_subcat 
                 FROM   dbo.prod_cat_info)                 AS Unq_Scat_cnt, 
                (SELECT DISTINCT store_type 
                 FROM   dbo.transactions)                  AS Unq_chnl_cnt, 
                (SELECT Max(tran_date) 
                 FROM   dbo.transactions)                  AS 
                Last_Transaction_date, 
                (SELECT Avg(qty) / Count(tran_date) 
                 from transactions)                        AS 
                                                           Avg_basket_qty, 
                (SELECT Avg(total_amt) / Count(tran_date) 
                 from transactions)                                          
                                                         AS Avg_basket_val 
INTO   customer_360 
FROM   dbo.customer AS c 
       INNER JOIN dbo.transactions AS t 
               ON t.cust_id = c.customer_id 
       INNER JOIN dbo.prod_cat_info AS pci 
               ON pci.prod_cat_code = t.prod_cat_code   

错误信息:

消息8120,第16级,状态1,第1行
列'dbo.Transactions.cust_id'在选择列表中无效,因为它既不包含在聚合函数中也不在GROUP BY子句中。

我的密码

最后两列是聚合查询。 因为您有一个没有FROM的SELECT,它将查询外部查询中指定的表。

            (SELECT Avg(qty) / Count(tran_date))       AS Avg_basket_qty, 
            (SELECT Avg(total_amt) / Count(tran_date)) AS Avg_basket_val 

在这种情况下,您要汇总qty,tran_date和total_amount,因此每隔一列就需要分组或汇总。

添加以下内容应使其成为有效的查询,但是它可能无法满足您的要求!

GROUP BY T.cust_id, c.Gender, C.city_code, DATEDIFF(mm,c.DOB,GETDATE())     

GROUP BY产生的行对于在该子句下指定的列中保存的值的组合是唯一的。 您的整体查询应该看起来像这样,在GROUP BY子句中列出了“非聚合列”

SELECT
      T.cust_id    --<< this is a "non-aggregating" column
    , c.gender     --<< this is a "non-aggregating" column
    , C.city_code  --<< this is a "non-aggregating" column
    , DATEDIFF(mm, c.dob, GETDATE())    AS AGE_IN_MONTHS --<< this is a "non-aggregating" column

    , SUM(total_amt)                    AS Tot_sal_amt
    , SUM(qty)                          AS tot_sal_qnty
    , COUNT(DISTINCT store_type)        AS Unq_chnl_cnt
    , MAX(tran_date)                    AS Last_Transaction_date
    , AVG(qty) / COUNT(tran_date)       AS Avg_basket_qty
    , AVG(total_amt) / COUNT(tran_date) AS Avg_basket_val 

--INTO customer_360
FROM dbo.customer AS c
INNER JOIN dbo.transactions AS t ON t.cust_id = c.customer_id
GROUP BY
      T.cust_id      --<< list each non-aggregating column here
    , c.gender       --<< list each non-aggregating column here
    , C.city_code    --<< list each non-aggregating column here
    , DATEDIFF(mm, c.dob, GETDATE())  --<< list each non-aggregating column here
  • 请注意,如果您在同一选择查询中(正确)使用GROUP BY 则“ 完全选择” 完全完全多余的 同样,“选择不同的对象”所做的事情少于GROUP BY对您的影响(例如SUM / MIN / MAX / AVG值)。

进一步说明:

AVG(qty) / COUNT(tran_date)将产生一个整数结果,您可能想这样做AVG(qty)/(COUNT(tran_date)* 1.0)

INNER JOIN dbo.prod_cat_info AS pci ON pci.prod_cat_code = t.prod_cat_code已删除INNER JOIN dbo.prod_cat_info AS pci ON pci.prod_cat_code = t.prod_cat_code可能会乘以结果。 将上面的查询与包含此联接的另一个查询进行比较。 如果聚合受到影响,那么您将需要对该表进行子查询并将其联接。 因此,以下几列也丢失了:

            (SELECT Count(DISTINCT prod_cat) 
             FROM   dbo.prod_cat_info)                 AS Unq_cat_cnt, 
            (SELECT DISTINCT prod_subcat 
             FROM   dbo.prod_cat_info)                 AS Unq_Scat_cnt,

这些也已删除,因为我不确定您的意图是什么:

            (SELECT Count(transaction_id) 
             FROM   transactions 
             GROUP  BY tran_date)  AS  basket_count_per_day,

这样的子查询不允许返回多个值; 这将做。 因此,这将导致错误,您需要确定如何将“每日平均值”合并到一个表中,每个客户一行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM