用SQL计算百分比
我正在尝试使用其他表创建表列,但在获取所需列时遇到问题。请导游 表名称:交易、客户、产品类别信息用SQL计算百分比,sql,Sql,我正在尝试使用其他表创建表列,但在获取所需列时遇到问题。请导游 表名称:交易、客户、产品类别信息 SELECT DISTINCT T.cust_id, c.gender, C.city_code, Datediff(mm, c.dob, Getdate()) AS AGE_IN_MONTHS, (SELECT Count(transact
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
错误消息:
Msg 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
在这种情况下,您要聚合数量、交易日期和总金额,因此其他每一列都需要分组或聚合
添加以下内容应使其成为有效的查询,但它可能不会执行您想要的操作
GROUP BY T.cust_id, c.Gender, C.city_code, DATEDIFF(mm,c.DOB,GETDATE())
GROUP BY生成的行对于在该子句下指定的列中保存的值的组合是唯一的。您的整个查询应该更像这样,其中非聚合列列列列在GROUPBY子句中
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
这些也被删除了,因为我不确定您打算用它做什么:
(SELECT Count(transaction_id)
FROM transactions
GROUP BY tran_date) AS basket_count_per_day,
这样的子查询不允许返回多个值;这就行了。因此,这将导致错误,您需要决定如何将每日平均值合并到每个客户一行的表中。建议您删除列,直到它重新开始工作,以缩小问题所在。您对错误消息的解释是什么?1。无法使用下面的查询表Customer\u 360 add primary key Customer\u id将t.cust\u id作为主键这是一个完全不同的问题!请针对上述代码提出一个新问题,如果我将行作为注释,其中包含counttransaction_id、avgqty、avgtotal_amt,则我可以创建新表。尽管我使用的是distinct,但它不允许将customer\u id作为主键:从transactions GROUP BY tran\u date中选择Counttransaction\u id作为basket\u count\u per\u day,我的目的是在一天内获得总交易量是的,我可以看到,但这与查询的余额不兼容。它不适合单一的表结构,您需要一些其他的东西。我已经运行了您提供的查询,它适用于任何需要的列。不确定其他reqd列。如果需要,我们会再试一次并请求您的帮助。非常感谢
(SELECT Count(transaction_id)
FROM transactions
GROUP BY tran_date) AS basket_count_per_day,