[英]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
进一步说明:
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.