用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,