2012-01-22 17 views
1

このクエリは、常に何も クエリは常に1つの空の行を返しますか?

(
    SELECT accounting.time, enclosure.enc_id_, enclosure.txt, accounting.amount AS sum, SUM(ROUND(vatcode.percent/(100+vatcode.percent)*accounting.amount)) AS sum_vat 
    FROM accounting 
    INNER JOIN enclosure ON enclosure.id=accounting.enc_id 
    LEFT JOIN vatcode ON vatcode.id=accounting.vatcode_id 
    WHERE accounting.account_id='10' 
) 
UNION (
    SELECT accounting.time, enclosure.enc_id_, enclosure.txt, accounting.amount*-1 AS sum, NULL AS sum_vat 
    FROM accounting 
    INNER JOIN enclosure ON enclosure.id=accounting.enc_id 
    WHERE accounting.accountoff_id='10' 
) ORDER BY time 

が、私はエラーが私はそれを削除した場合、私は同じ文を持っていないというエラーを取得します。.. ... , NULL AS sum_vatここで選択した第二に起こることを知っていなくても、少なくとも1行を返します両方の選択で?どのようにこれを解決することができますか?あなたがして、グループなしで集計を使用している場合

リターン

Array 
(
    [time] => 0 
    [enc_id_] => 0 
    [txt] => 
    [sum] => 0 
    [sum_vat] => 
) 
+0

返された行を何に見えますか?サンプルデータを追加できますか? – Andomar

+0

更新された質問..もし 'sum_vat'が選択されていない両方の行から削除されていれば、 – clarkk

答えて

3

は、集合体は常に単一の行を返す、テーブル全体にわたり実行されます。たとえば、

select max(price) from items where group = 'Servers' 

は、最高価格の1行を返します。 MySQLはなく、他の列を可能にする唯一のデータベースですgroup by

select name, max(price) from items where group = 'Servers' 

しかし、紛らわしい、それだけで名前欄のランダムな値を入れます。ここの名前は最高価格のサーバーの名前ではありません。あなたのケースでは

、明白な解決策は、労働組合の最初の部分にgroup byを追加することです:

SELECT accounting.time, enclosure.enc_id_, enclosure.txt, accounting.amount sum, 
    SUM(ROUND(vatcode.percent/(100+vatcode.percent)*accounting.amount)) sum_vat 
FROM accounting 
INNER JOIN enclosure ON enclosure.id=accounting.enc_id 
LEFT JOIN vatcode ON vatcode.id=accounting.vatcode_id 
WHERE accounting.account_id='10' 
GROUP BY accounting.time, enclosure.enc_id_, enclosure.txt, accounting.amount 
関連する問題