2

次のコードを使用すると、「アウト」ではないアイテムの数を取得できますが、個々のアイテムではなく、すべてのアイテムのパーセンテージが返されます。すべてのユニット ID のすべての日付をカウントする count(date) と関係があることはわかっています。合計パーセンテージが表示されないように、各アイテムを個別にカウントする方法はありますか?

SELECT unitid, (COUNT(date)* 100 / (SELECT COUNT(*) FROM items)) AS Percentage
FROM items
WHERE date !='Out'
GROUP BY unitid

EDIT1、明確化: 製品 a、b、c、d、e の各製品が 2 つあり、各アイテムの 1 つが「アウト」であるとしましょう。私が得る結果は次のとおりです。

    unitid    Percentage
1.  a         10
2.  b         10
3.  c         10
4.  d         10
5.  e         10

代わりにこれを表示したい:

    unitid    Percentage
1.  a         50
2.  b         50
3.  c         50
4.  d         50
5.  e         50

ありがとう :)

4

3 に答える 3

2

カウント項目と選択された項目の間のリンクが必要です。

SELECT
   unitid,
   COUNT(date) * 100
      / (SELECT COUNT(*) FROM items B WHERE B.unidid = A.unitid) AS Percentage
FROM items A
WHERE date !='Out'
GROUP BY unitid
于 2012-12-28T12:21:37.190 に答える
2

クエリにサブクエリは必要ありません。条件付き集計だけです。

SELECT i.unitid, 100*sum(case when date <> 'Out' then 1 else 0 end)/count(date) as Percentage
FROM items i
GROUP BY unitid

[date] が NULL になることはないと仮定すると、これは次のように簡単に表現できます。

select i.unitid, 100*avg(case when date<>'out' then 1.0 else 0 end) as Percentage
from items i
group by unitid
于 2012-12-28T15:40:58.687 に答える
0

これを正しく理解しているかどうか見てみましょう。a が 1 つ、b が 2 つ、c が 3 つ、d が 4 つある場合、それぞれの 1 つが「Out」であり、それが何であれ、結果セットは次のようになります。

    unitid    Percentage
1.  a         100.00
2.  b         50.00
3.  c         33.33
4.  d         25.00

これを行うには、これを試すことができます:

Select counts.unitId, 100.0 *outcounts.count/ counts.count  as Percentage
from (select unitid, count(*) as count 
        from items 
        where items.date ='Out' 
        group by unitid) as outcounts
  inner join (select unitid, count(*) as count 
              from items 
              group by unitid) as counts
    on outcounts.unitId = counts.unitId

ここにセットアップのSQL Fiddleがあります

于 2012-12-28T12:33:15.663 に答える