0

COUNTさまざまな基準に基づいて複数のを使用し、値をグループ化できるSQLクエリを記述できるようにしたいと考えています。

製品の価格を変更し、人々が支払った金額を分析したいという(缶詰の)シナリオがあるとします。

SELECT Product, COUNT(*) as Total FROM Orders WHERE Location = 'Amazon'

SELECT Product, COUNT(*) as HighPriceCount FROM Orders 
  WHERE Location = 'Amazon' and PRICE > 10

ここから、こういう結果が見られるようになりたいです。

--------------------------------------------
| Product | Total | HighPriceCount | Avg   |
--------------------------------------------
| Game 1  | 50    | 20             | .40   |
| Prod 2  | 300   | 200            | .66   | 
--------------------------------------------

ここで平均 「10を超える価格」/「販売合計」です。私の最初のアプローチはグループ化Productすることですが、「内部選択」が唯一のパスであるかどうか、またはこれを行うためのよりエレガントな方法があるかどうかを確認したかったのです。多くの重複のように見えますか?これが私の最初のバージョンのクエリです。

-- I don't know if this works?
SELECT Product, COUNT(*) AS Total, 
(
   SELECT Product, COUNT(*) FROM Orders WHERE Location = 'Amazon' and Price > 10
   GROUP BY Product
) AS HighPriceCount,
(Total / HighPriceCount) AS Avg
From Orders
WHERE Location = 'Amazon'
GROUP BY Product
4

5 に答える 5

2

カウントを取得するには、以下のようにCASEforを使用HighPriceCountします。null集計関数は、次を除いてカウントされません。COUNT(*)

SQLフィドルの例

SELECT Product, COUNT(*) as Total, 
       COUNT(case when price > 10 then 1 end) as HighPriceCount,
       SUM(case when price > 10 then price end)/COUNT(*) as Avg
FROM Orders 
WHERE Location = 'Amazon'
GROUP BY Product
于 2013-03-06T19:01:42.380 に答える
1

SUM と CASE を使ってみましたか?(うまくいくはずだと思うので、正しく試すことはできません)

SELECT PRODUCT,
       SUM(CASE WHEN PRICE>10 THEN 1 ELSE 0 END) as highpricecount,
       COUNT(CASE WHEN PRICE>10 THEN 1 END) as total
FROM Orders 
WHERE LOCATION='AMAZON'
GROUP BY PRODUCT;
于 2013-03-06T19:02:20.150 に答える
0

これが私の...

Select  Product, Total, HighPriceCount, HighPriceCount/Total As Avg
From   (Select  Product,
                Sum(Case When Location = 'Amazon' Then 1 Else 0 End) As Total,
                Sum(Case When Location = 'Amazon' And Price > 10 Then 1 Else 0 End) As HighPriceCount,
        From    Orders
        Group   By Product) o
于 2013-03-06T19:05:01.547 に答える
0

ここは私のものです

Select 
Product, Sum(Total) as Total, Sum(HighPriceCount) as HighPriceCount,Total/HighPriceCount as AVG
from 
(
select Product, 1 as Total, case WHEN PRICE>10 THEN 1 ELSE 0 END as HighPriceCount
from Orders where LOCATION='AMAZON'
) 
group by Product
于 2013-03-06T19:14:40.710 に答える
0

あなたのクエリは機能しません。これをお試し下さい:

select A.Product, A.Total, ISNULL(B.HighPriceCount,0), B.HighPriceCount*1.0/A.Total*1.0 as [Avg]
(select Product, count(*) as Total
from Orders 
where Location='Amazon'
group by Product ) A
left join 
(SELECT Product, COUNT(*) as HighPriceCount 
from Orders 
where Location = 'Amazon' and Price > 10
group by Product) B
on A.Product = B.Product

私はあなたのデータベースを持っていないので、タイプミスがあるかもしれません。このクエリをテストすることはできませんが、あなたの変更でうまくいくはずです。

于 2013-03-06T19:30:40.103 に答える