0

ライセンスの価格を計算する SQL クエリを作成しようとしています。以下のスキーマを確認してください。

表:価格

| ID (bigint) | USERS(Bigint) |  TYPE (varchar) | PRICE (BIGINT)
------------------------------------------------------------------
|  1          |        1      |      other      |       20     |
|  2          |        15     |      local      |       13.96  | 

表:ライセンス

| ID (bigint) | USERID (Bigint) |STATUS(VARCHAR) |  USERS(bigint) | DEVICES(BIGINT) | TYPE(VARCHAR) | REQUEST_TYPE (VARCHAR) | 
--------------------------------------------------------------------------------------------------------------
|  1          |    13           |      10        |       10        |     local     |           add          | 
|  2          |    13           |      15        |       20        |     other     |           extend       | 

私の目的:

ユーザーIDとタイプを指定して、次の基準に基づいてすべてのライセンスの合計価格を計算したいと思います:

特定のユーザー ID とタイプについて:

1) request_type が新規 (または) 拡張のいずれかであるすべてのライセンスを取得します。

2) そのようなライセンスごとに、ユーザー数 (USERS 列) を「価格」表の USERS 列と照合し、デバイスとして計算を行います* (価格表からの関連付けられた価格)

3) これを使用して、そのようなすべての価格の合計を計算し、合計価格を返します。

次のクエリを使用してこれを実行しようとしていますが、まだ成功していません:

SELECT SUM(PRICE) FROM prices
LEFT OUTER JOIN licenses
ON ( 
  prices.users=licenses.users
  AND prices.type=licenses.type
)
WHERE licenses.userid=13
AND licenses.status='approved'
AND licenses.request_type IN ('add','extend')

ここで SQL Fiddle を確認してください: http://sqlfiddle.com/#!2/05f5cf

助けてください。

ありがとう、デビッド

4

2 に答える 2

0

クエリで LEFT OUTER JOIN の条件が見つからないため、結果は null になります

クエリがあります

SELECT SUM(PRICE) FROM prices
LEFT OUTER JOIN licenses
ON ( 
  prices.users=licenses.users
  AND prices.type=licenses.type //cannot found condition on table
)
WHERE licenses.userid=13 
AND licenses.status='approved'
AND licenses.request_type IN ('add','extend')

これはテーブル内のデータです

テーブル ライセンス

(1, 'approved', 10, 10, 'local', 'add', 13),
(2, 'approved', 15, 20, 'other', 'extend', 13);

とテーブルの価格

(1, 1, 'other', 20),
(2, 15, 'local', 13.96);

そしてあなたの状態は

  prices.users=licenses.users
  AND prices.type=licenses.type //cannot found condition on table
 that mean if from your table is

  at licences table have a type="other" and users=15 
  but at prices table haven't have type="other" and users=15

結果はnullになります

テーブルの価格の最初の行を変更すると (1, 1, 'other', 20) が (1, 15, 'other', 20) になるため、

結果= 20になります

クエリの最初の行を変更する必要があります

SELECT SUM(PRICE) FROM prices

be

SELECT IFNULL(SUM(PRICE),0) FROM prices

これは、行が 0 ではない null ではない場合、結果を変更します

于 2013-11-15T11:03:07.190 に答える
0

あなたのコメントと更新から、私はあなたが望むと思います (ユーザーのライセンスとユーザーの価格を比較する必要があるかどうかはわかりませんが、これが必要なようです)

select coalesce(sum( p.users * p.price), 0)
FROM licenses l
inner join prices p
  on  p.type = l.type
  --and p.users = l.users
where l.status = 'approved'
and l.request_type in ('add', 'extend')
and l.userid = 13

編集

実際、 type AND users が同一であること、または users のみであることを確認する必要がありますか?

ユーザーのチェックのみが必要な場合は、

inner join prices p
  on  p.users = l.users

タイプのチェックのみが必要な場合

inner join prices p 
  on p.type = l.type

両方が必要な場合は、サンプル データで 0 を取得します。

3 つのバージョンのSqlFiddleを参照してください。

于 2013-11-15T10:47:15.060 に答える