2017-07-04 17 views
0

別のテーブルを使用してテーブルを作成しようとしましたが、目的のカラムを取得できませんでした。ご案内ください。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句に含まれていないためです。

My Code

+0

問題がどこにあるかを絞り込むために、列が再び機能するまで列を削除することをお勧めします。 – JeffUK

+0

エラーメッセージの解釈は何ですか? –

答えて

1

最後の2つの列は、集約クエリです。 FROMなしのSELECTがあるので、外部クエリで指定されたテーブルをクエリします。この場合

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

、このような他のすべての列がグループ化や集約のいずれかを必要として、あなたは、数量、tran_dateとTOTAL_AMOUNTを集約しています。

これを有効なクエリにする必要がありますが、それはあなたがしたいことをしないかもしれません!

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

1.以下のクエリを使用して主キーとしてt.cust_idを作成できません(alter table Customer_360 プライマリキー(Customer_ID)を追加してください) –

+0

これは全く別の問題です!上記のコードに対して新しい質問 – JeffUK

+0

を作成してください。 count(transaction_id)、avg(qty)、avg(total_amt)を持つコメントとして行を作成すると、新しいテーブルを作成します。私は別名を使用していても、customer_idをプライマリキー –

0

GROUP BYは、その句で指定した列に保持されている値の組み合わせに対してUNIQUEの行を生成します。あなたの全体的なクエリは、完全に冗長あれば、全く、全くある

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句にリストされているところ、この、のようになります。同じSELECTクエリでGROUP BY(正しく)を使用しています。また、「選択してください」は、GROUP BYよりも少ない(たとえば、SUM/MIN/MAX/AVG値)ことができます。

さらに注記:

AVG(qty)/COUNT(tran_date)が整数結果が生成されます、ヨーヨーは、この代わりにAVG(数量)/(COUNT(tran_date)* 1.0)をやってみたいことがあり

これは、参加削除されました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, 

このようなサブクエリが許可されていません複数の値を返す。これが行うことになります。したがって、エラーが発生し、顧客ごとに1行のテーブルに「日々の平均値」を組み込む方法を決定する必要があります。

+0

として許可していません。 (SELECT Count(transaction_id) FROMトランザクション GROUP BY tran_date)AS basket_count_per_day、 私の意図は、1日に合計トランザクションを取得することでした。 –

+0

はい、私はそれを見ることができますが、それはクエリの残高と互換性がありません。単一のテーブル構造に合っていない場合は、別のものが必要です。 –

+0

私はあなたが提供したクエリを実行しましたが、それはどんな列に対しても働きました。他の必要な列についてはわかりません。必要に応じて再度お試しいただき、あなたの助けを仰いでください。多くの感謝 –

関連する問題