2017-04-05 10 views
1

MYSQLデータベースに2つのテーブルがあり、それらをビューでマージする必要があります。 両方のテーブルで正しい結果を得るには数学を熟読しなければなりません。同じ日にそれらを注文しなければなりません。異なる列で複数の合計を実行してビューを作成する

最初の表は、以下のいずれかのようで、それはchiusureと呼ばれています:

+----+------------+--------+--------+---------+------+----+ 
| id | data  | totale | sconti | annulli | resi | sf | 
+----+------------+--------+--------+---------+------+----+ 
| 1 | 2016-03-01 | 153.82 | 1.07 | 0.00 | 0.00 | 34 | 
| 2 | 2016-03-02 | 241.58 | 0.01 | 0.00 | 0.00 | 32 | 
| 3 | 2016-03-03 | 0.00 | 0.01 | 0.00 | 0.00 | 0 | 
| 4 | 2016-03-04 | 0.00 | 0.00 | 0.00 | 0.00 | 0 | 
| 5 | 2016-03-05 | 0.00 | 0.00 | 0.00 | 0.00 | 0 | 
+----+------------+--------+--------+---------+------+----+ 

秒以下の表は、1のようなもので、それはemergenzaと呼ばれています:

+----+------------+----------+--------+ 
| id | data  | ora  | totale | 
+----+------------+----------+--------+ 
| 1 | 2016-03-04 | 09:30:00 | 2.20 | 
| 2 | 2016-03-04 | 09:40:00 | 9.00 | 
| 3 | 2016-03-04 | 09:50:00 | 5.00 | 
|....|............|..........|........| 
| 27 | 2016-03-05 | 09:14:00 | 4.40 | 
| 28 | 2016-03-05 | 09:27:00 | 5.00 | 
| 29 | 2016-03-05 | 09:33:00 | 2.20 | 
|....|............|..........|........| 
+----+------------+----------+--------+ 

私はここに難しい何されますemergenzaテーブルには、同じ日付の複数の行があります。別のビュー(view_emergenza)で、私はこのように、日付によってそれらをグループ化:

SELECT 
    data, 
    sum(totale) AS chiusura, 
    count(id) AS sf 

FROM emergenza 

GROUP BY DAY(data); 

を結果は次のとおりです。

+------------+----------+----+ 
| data  | chiusura | sf | 
+------------+----------+----+ 
| 2016-03-04 | 178.90 | 26 | 
| 2016-03-05 | 330.55 | 52 | 
| 2016-03-06 | 333.55 | 46 | 
| 2016-03-07 | 272.40 | 31 | 
| 2016-03-08 | 169.40 | 28 | 
| 2016-03-09 | 223.40 | 20 | 
| 2016-03-10 | 206.00 | 19 | 
| 2016-03-11 | 157.50 | 22 | 
+------------+----------+----+ 

また私は2つのテーブルを合計する前にいくつかの数学を実行する必要があります。

SELECT data, (totale - annulli - resi) AS chiusura, sf 
    FROM chiusure 

結果は次のとおりです:私は1つのユニークなビューに2つのビューをマージする。この時点で

+------------+----------+----+ 
| data  | chiusura | sf | 
+------------+----------+----+ 
| 2016-03-01 | 153.82 | 34 | 
| 2016-03-02 | 241.58 | 32 | 
| 2016-03-03 |  0.00 | 0 | 
| 2016-03-04 |  0.00 | 0 | 
| 2016-03-05 |  0.00 | 0 | 
+------------+----------+----+ 

ビュー(view_chiusure)で、私は希望の結果を達成するために数学のこの種を施行し:

  • GROUP BY DAY(データ)データ
  • (chiusure.totale - chiusure.annulli - chiusure.resi)AS + [和(emergenza.totale)GROUP emergenza.data WHERE emergenza.data = chiusure.data]
  • chiusure.sf + [カウント(emergenza.id)emergenza.data WHERE emergenza.data = chiusure.data BY GROUP]

UPDATE BY

私はこの方法で試しました:

SELECT 
     C.data, 
     C.chiusura + (SELECT E.chiusura FROM view_emergenza E WHERE E.data = C.data) AS chiusura, 
     C.sf + (SELECT E.sf FROM view_emergenza E WHERE E.data = C.data) as sf 
    FROM view_chiusure C 

が、view_chiusure.chiusuraview_chiusure.sfは完全に無視されるようだ

+------------+----------+------+ 
| data  | chiusura | sf | 
+------------+----------+------+ 
| 2016-03-01 |  NULL | NULL | 
| 2016-03-02 |  NULL | NULL | 
| 2016-03-03 |  NULL | NULL | 
| 2016-03-04 | 178.90 | 26 | 
| 2016-03-05 | 330.55 | 52 | 
| 2016-03-06 | 333.55 | 46 | 
| 2016-03-07 | 272.40 | 31 | 
| 2016-03-08 | 169.40 | 28 | 
| 2016-03-09 | 223.40 | 20 | 
| 2016-03-10 | 206.00 | 19 | 
+------------+----------+------+ 

結果は

+------------+----------+------+ 
| data  | chiusura | sf | 
+------------+----------+------+ 
| 2016-03-01 | 153.82 | 34 | 
| 2016-03-02 | 241.58 | 42 | 
| 2016-03-03 |  0.00 | 0 | 
| 2016-03-04 | 178.90 | 26 | 
| 2016-03-05 | 330.55 | 52 | 
| 2016-03-06 | 333.55 | 46 | 
| 2016-03-07 | 272.40 | 31 | 
| 2016-03-08 | 169.40 | 28 | 
| 2016-03-09 | 223.40 | 20 | 
| 2016-03-10 | 206.00 | 19 | 
+------------+----------+------+ 

2つのテーブルをマージし、合計することが可能ですすべきですか?はいの場合、どうすればいいですか?

+1

MySQLまたはSQL Serverのどちらを使用しているかを明確にしてください。 2つの異なるRDBMS用のタグがあります。 –

+0

@CᴏʀʏMYSQL。一定。 – dcdeiv

答えて

0

この問題の解決策はかなり複雑でしたが、私はこの問題を解決したESISTSCASEを見つけました。

溶液である:view_emergenza上記溶液中

SELECT 
     C.data, 
     (
      CASE 
       WHEN 
        EXISTS (SELECT E.chiusura FROM view_emergenza E WHERE E.data = C.data) = 1 
         THEN (SELECT E.chiusura FROM view_emergenza E WHERE E.data = C.data) 
       ELSE 0 
      END 
     ) 
     + C.chiusura AS chiusura 
    FROM view_chiusure C 

2つのテーブルを加算するのではなく、view_chiusureを上書きします。これはなぜ私にはまだ不明です。

EXISTSは、クエリが何らかの値を返すかどうかをチェックします。 EXISTSはブール値(真、偽、1、0)を返しますので、行が一致しているかどうかを確認する必要がありました。ここにケースが表示されます。

行が一致しているのであれば、それはを選択し、希望の値を返す実行します、ELSE それは最終的に私が最初のテーブルの列に結果を追加します0

を返すことがあります。

これが結果です:

+------------+----------+ 
| data  | chiusura | 
+------------+----------+ 
| 2016-03-01 | 153.82 | 
| 2016-03-02 | 241.58 | 
| 2016-03-03 |  0.00 | 
| 2016-03-04 | 178.90 | 
| 2016-03-05 | 330.55 | 
+------------+----------+ 

私はoriginaryテーブルにchiusure

UPDATE chiusure SET totale = 50 WHERE data = "2016-03-04"; 

を更新し、いくつかのテストを行うには当初、それはまだ同じ0

+----+------------+--------+--------+---------+------+----+ 
| id | data  | totale | sconti | annulli | resi | sf | 
+----+------------+--------+--------+---------+------+----+ 
| 1 | 2016-03-01 | 153.82 | 1.07 | 0.00 | 0.00 | 34 | 
| 2 | 2016-03-02 | 241.58 | 0.01 | 0.00 | 0.00 | 32 | 
| 3 | 2016-03-03 | 0.00 | 0.01 | 0.00 | 0.00 | 0 | 
| 4 | 2016-03-04 | 50.00 | 0.00 | 0.00 | 0.00 | 0 | 
| 5 | 2016-03-05 | 0.00 | 0.00 | 0.00 | 0.00 | 0 | 
+----+------------+--------+--------+---------+------+----+ 

view_emergenzaありました:

+------------+----------+----+ 
| data  | chiusura | sf | 
+------------+----------+----+ 
| 2016-03-04 | 178.90 | 26 | 
| 2016-03-05 | 330.55 | 52 | 
| 2016-03-06 | 333.55 | 46 | 
| 2016-03-07 | 272.40 | 31 | 
| 2016-03-08 | 169.40 | 28 | 
+------------+----------+----+ 

は、新しいビューに結果がある:

+------------+----------+ 
| data  | chiusura | 
+------------+----------+ 
| 2016-03-01 | 153.82 | 
| 2016-03-02 | 241.58 | 
| 2016-03-03 |  0.00 | 
| 2016-03-04 | 228.90 | 
| 2016-03-05 | 330.55 | 
+------------+----------+ 

同じカラムSFが印加されます。

0

一致する行が失われないように、ユニオン内の各選択に人工の列を追加する必要があります。

2と仮定すると、あなたが示しているとおりに作業を集約したい選択し、この作業をする必要があります:あなたが最初のビューview_emergenzaview_chiusureを作成する必要があります

select 'data' as data, 
     sum(chiusura) as chiusura, 
     sum(sf) as sf from 
(
    SELECT 1 as col, chiusure.`data`, (chiusure.totale - chiusure.annulli - chiusure.resi) AS chiusura, chiusure.sf 
    FROM chiusure 

    UNION 
    SELECT 2 as col, emergenza.`data`, emergenza.totale as chiusura, count(emergenza.id) as sf 
    FROM emergenza 
) tables 
group by 'data' 
+0

「ビューのSELECTにFROM句にサブクエリが含まれています」というエラーが表示される – dcdeiv

0

。 次に、あなただけの日付を取得するためにビューを作成する必要があります。次のように今、あなたはベースビューに参加する別のビューを作成することができます

CREATE VIEW vu_distinct_data AS 
    SELECT DISTINCT data 
    FROM vu_data 

CREATE VIEW vu_data AS 
    (
    SELECT data FROM view_chiusure 
    UNION 
    SELECT data FROM view_emergenza 
) 

はその後明確な日付を取得するためにビューを作成

CREATE VIEW vu_join AS 
    SELECT 
    (SELECT C.chiusura FROM view_chiusura C WHERE C.data=D.data)+ 
    (SELECT E.chiusura FROM view_emergenza E WHERE E.data=D.data) AS chiusura, 
    (SELECT C.sf FROM view_chiusura C WHERE C.data=D.data)+ 
    (SELECT E.sf FROM view_emergenza E WHERE E.data=D.data) AS sf, 
    D.data 
    FROM vu_distinct_data D 

今、あなたは簡単にvu_joinを使用することができます。

SELECT * 
FROM vu_join 
ORDER BY data 
+0

基本的には、必要な結果を得るために5つのビューを作成する必要がありますか? – dcdeiv

+0

はい、これは、2つのテーブルの1つに表示されず、他のテーブルに表示される日付があるためです。 –

+0

すべての日付が両方のテーブルに表示される場合、1つのビューに書き込むことができます。 –

関連する問題