0

次の MySQL テーブルを検討してください。


MORTALITY (死亡した子豚を飼っている飼育者を含む)

raiserID  |  issuedDate  |  rotationNo |  numberDead
-----------------------------------------------------
   0052      2012-08-03         1             3


PIGLET_PO (飼育者による子豚取引の購入を含む)

~ レイザーはここに複数のレコードを持つことができます

raiserID  |  deliveredDate  |  rotationNo  |  noOfDeliveredPigs  |  sellerID
------------------------------------------------------------------------------
   0052       2012-07-20          1                  10                1
   0052       2012-07-21          1                  15                1


SELLER_LIST

sellerID |  sellerName  
------------------------
    1       Solar Farm


期待される結果:

sellerName  |  population  |  deceased
-----------------------------------------
Solar Farm         25            3     


  • Raiser は、豚/豚の世話をする/育てる人です。
  • rotationNo は、調達者が実施した、または現在実施中の調達サイクルを参照する一意の識別子です。

これまでのところ、予想される結果と同様の結果が得られる次のクエリがあります。よくわかりませんが、piglet_po に 2 つのレコード/行があることに関係があると思います。ここで何が欠けていますか?

SELECT s.sellerName AS sellerName, SUM(p.noOfDeliveredPigs) AS population, SUM(numberDead) AS heads
FROM mortality m

JOIN piglet_po p
ON m.raiserid = p.raiserid
AND m.rotationNo = p.rotationNo

JOIN seller_list s
ON p.sellerID = s.sellerID

// This WHERE condition and the given string value that follow came from and is based on
a select drop-down box and shouldnt be modified since this is how I display them in html WHERE DATE_FORMAT(m.issuedDate, '%M %Y') = 'August 2012' GROUP BY sellerName HAVING SUM(numberDead) != 0
4

2 に答える 2

1

これは、 table の結合で使用される列の値が重複しているためですpiglet_po(p.rotationNo)。代わりにこれを試すか、ステートメントDISTINCTで句を使用することもできます。SELECT

SELECT s.sellerName AS sellerName, SUM(p.noOfDeliveredPigs) AS population, 
       SUM(numberDead) AS heads
FROM mortality m
    JOIN (SELECT rotationNo, raiserid, sellerID, SUM(noOfDeliveredPigs) AS noOfDeliveredPigs
          FROM  piglet_po 
          GROUP BY rotationNo, raiserid, sellerID
         ) p
         ON m.raiserid = p.raiserid
            AND m.rotationNo = p.rotationNo
    JOIN seller_list s
         ON p.sellerID = s.sellerID
WHERE DATE_FORMAT(m.issuedDate, '%M %Y') = 'August 2012'
GROUP BY sellerName
HAVING SUM(numberDead) != 0;
于 2012-08-09T11:58:20.043 に答える
1

これを試して:

select sellername , population  , deceased 
from
    (select p.rotationno,p.raiserid,s.sellername as sellername
           , sum(p.noofdeliveredpigs) as population 
    from piglet_po p
    join seller_list s
    on p.sellerid = s.sellerid 
    group by p.rotationno,p.raiserid,sellername)p
join
    (select rotationno,raiserid,sum(numberdead) as deceased
    from mortality 
    where date_format(issueddate, '%m %y') = 'august 2012'
    group by rotationno,raiserid)m
on m.raiserid = p.raiserid
and m.rotationno = p.rotationno
于 2012-08-09T12:55:34.120 に答える