0

私は今、私が持っているこのSUMクエリの解決策を見つけようとして何年も費やしてきました:

SELECT o.id, o.ordernr, o.datetime, o.status, CONVERT(ROUND(o.shipping,2), CHAR(8)) AS shippingcosts, 
u.id AS uid, u.name, u.surname, u.address, u.number, u.zipcode, u.country, u.email, 
GROUP_CONCAT(CONVERT(op.amount, CHAR(8))) AS amount,         
GROUP_CONCAT(CONVERT(ROUND(op.pprice,2), CHAR(8))) AS pprice, 

IF(     
        u.country!= 'NL', 
        ROUND(SUM(
            CASE
                WHEN op.discount > 0 THEN ((op.amount * op.pprice) - ((op.amount * op.pprice) * (op.discount/100)))
                WHEN op.discountf > 0 THEN ((op.amount * op.pprice) - ((op.amount * op.pprice) * (op.discountf/100)))
                WHEN op.discountf = 0 && op.discount = 0 THEN (op.amount * op.pprice)
            END
        ) + o.shipping,2),
        ROUND((SUM(
            CASE
                WHEN op.discount > 0 THEN ((op.amount * op.pprice) - ((op.amount * op.pprice) * (op.discount/100)))
                WHEN op.discountf > 0 THEN ((op.amount * op.pprice) - ((op.amount * op.pprice) * (op.discountf/100)))
                WHEN op.discountf = 0 && op.discount = 0 THEN ((op.amount * op.pprice)*1.19)
            END
        )*1.19) + o.shipping,2)
) AS total, 

GROUP_CONCAT(CONVERT(p.id, CHAR(8))) AS pid, 
SUM(p.weight) AS weight, 
FROM orders AS o
INNER JOIN users AS u ON o.uid = u.id 
INNER JOIN order_products AS op ON op.oid = o.id
INNER JOIN products AS p ON op.pid = p.id
GROUP BY o.id

私が達成しようとしているのは、op.discount が null でない場合、または op.discountf が null でない場合、および op.discount と op.discountf の両方が null である行ごとに、各行の合計を取得することです...

この時点で、mysql は代わりにすべての合計を合計しているようです..??

誰か手を貸してくれませんか??

事前にt​​hnx(たくさん)

4

2 に答える 2

0

「私が達成しようとしているのは、op.discount が null でない場合、または op.discountf が null でない場合、および op.discount と op.discountf の両方が null である各行について、各行の合計を取得することです。 ..」その場合は、op.discount と op.discountf を比較したときにそれに応じて評価される値を保持しているかのように扱うのではなく、特に NULL 値をテストする case ステートメントの WHEN 条件に条件を追加することをお勧めします。 0.別名、「NULL < 0」はゼロではなくNULLに評価されます...そしてそれがあなたのケースステートメントにどのように影響するかわかりませんか? 制御ステートメントで NULL 値を使用する方法の詳細については、こちらを参照してください。

クエリを最初に見たとき、その存在そのものに反対するかもしれないと思いました... しかし、詳しく見てみると、実際には気分を害することはありませんでした。私はこのようなクエリを書くのが好きなので、それはあまり言いません。おそらく、あなたがしていることを行うためのよりクリーンな方法がありますが、なぜあなたの方法がうまくいかないのかわかりません。この行の最後にカンマがあります:

SUM(p.weight) AS weight,

...私はあなたがそこにいたくないと思いますか? クエリを少し再フォーマットしました...良くはあ​​りませんが、少しだけ異なります。あなたが何をしているのかをより明確に見ることができるようになりました。他の人を助けるかもしれないので、以下に含めます。他の人はこのフォーマットを好まないかもしれないので、質問への編集として紹介しませんでした. 私がこれまでに行ったこと/気づいたことが他の誰かを助けるかもしれないという可能性を考えて、今この回答を投稿してください。私が何か他のものを見た場合、私の「答え」を改善するために編集します。

SELECT
    o.id,
    o.ordernr,
    o.datetime,
    o.status,
    CONVERT(ROUND(o.shipping,2), CHAR(8)) AS shippingcosts, 
    u.id AS uid,
    u.name,
    u.surname,
    u.address,
    u.number,
    u.zipcode,
    u.country,
    u.email, 
    GROUP_CONCAT(CONVERT(op.amount, CHAR(8))) AS amount,         
    GROUP_CONCAT(CONVERT(ROUND(op.pprice, 2), CHAR(8))) AS pprice, 
    IF(     
        u.country != 'NL', 
        ROUND(SUM(
            CASE
                WHEN op.discount > 0 THEN ((op.amount * op.pprice) - ((op.amount * op.pprice) * (op.discount / 100)))
                WHEN op.discountf > 0 THEN ((op.amount * op.pprice) - ((op.amount * op.pprice) * (op.discountf / 100)))
                WHEN op.discountf = 0 && op.discount = 0 THEN (op.amount * op.pprice)
            END
        ) + o.shipping, 2),
        ROUND((SUM(
            CASE
                WHEN op.discount > 0 THEN ((op.amount * op.pprice) - ((op.amount * op.pprice) * (op.discount / 100)))
                WHEN op.discountf > 0 THEN ((op.amount * op.pprice) - ((op.amount * op.pprice) * (op.discountf / 100)))
                WHEN op.discountf = 0 && op.discount = 0 THEN ((op.amount * op.pprice) * 1.19)
            END
        ) * 1.19) + o.shipping, 2)
    ) AS total, 
    GROUP_CONCAT(CONVERT(p.id, CHAR(8))) AS pid, 
    SUM(p.weight) AS weight,
FROM
    orders o INNER JOIN users u
        ON o.uid = u.id 
    INNER JOIN order_products op
        ON o.id = op.oid
    INNER JOIN products p
        ON op.pid = p.id
GROUP BY o.id
于 2012-06-11T16:02:19.483 に答える
0

ここで私が気づいていることがいくつかあります....

--すべての整数または浮動小数点データ型を文字に変換していますか? MySQL で文字をどのように合計しますか?

SELECT o.id, o.ordernr, o.datetime, o.status, CONVERT(ROUND(o.shipping,2), CHAR(8)) AS shippingcosts, 
u.id AS uid, u.name, u.surname, u.address, u.number, u.zipcode, u.country, u.email, 
GROUP_CONCAT(CONVERT(op.amount, CHAR(8))) AS amount,         
GROUP_CONCAT(CONVERT(ROUND(op.pprice,2), CHAR(8))) AS pprice, 

-- group_concat で CONVERT 関数を見たことがない、これはリファレンス マニュアルに示されているコードです GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC] [,col_name ...]] [SEPARATOR str_val]) -- また、四捨五入し続けると、正しい結果が得られず、気にするかどうかわからないまま放り投げるだけです。集計が多すぎると思います。混乱するかもしれません。

IF(     
    u.country!= 'NL', 

-- select でこれらを丸めませんでしたか? ここでもう一度丸める必要がありますか?-- また、各行には割引と割引がありますか? 両方ある場合、最初の 2 つの CASE 構造に 2 回収まります... -- 重量に基づいた送料も必要なようです。

    ROUND(SUM(
        CASE
            WHEN op.discount > 0 THEN ((op.amount * op.pprice) - ((op.amount * op.pprice) * (op.discount/100)))
            WHEN op.discountf > 0 THEN ((op.amount * op.pprice) - ((op.amount * op.pprice) * (op.discountf/100)))
            WHEN op.discountf = 0 && op.discount = 0 THEN (op.amount * op.pprice)
        END) + o.shipping,2),

-- なぜ同じ CASE 構造を 2 回実行しているのですか? 追加するもの *1.19?

    ROUND((SUM(
        CASE
            WHEN op.discount > 0 THEN ((op.amount * op.pprice) - ((op.amount * op.pprice) * (op.discount/100)))
            WHEN op.discountf > 0 THEN ((op.amount * op.pprice) - ((op.amount * op.pprice) * (op.discountf/100)))
            WHEN op.discountf = 0 && op.discount = 0 THEN ((op.amount * op.pprice)*1.19)
        END)*1.19) + o.shipping,2)
) AS total, 

GROUP_CONCAT(CONVERT(p.id, CHAR(8))) AS pid, 
SUM(p.weight) AS weight, 
FROM orders AS o
INNER JOIN users AS u ON o.uid = u.id 
INNER JOIN order_products AS op ON op.oid = o.id
INNER JOIN products AS p ON op.pid = p.id
GROUP BY o.id

私は個人的に次のようなことをしようとします(おそらく内部結合を調整するだけでは機能しません):

SELECT * FROM products as p
(SELECT o.id, o.ordernr, o.datetime, o.status, CONVERT(ROUND(o.shipping, 2), CHAR(8)) AS     ShippingCosts,
u.id AS U_ID, u.name, u.surname, u.address, u.number, u.zipcode, u.coutnry, u.email, 
op.amount as Amount, op.pprice as Price, 
SUM((op.amount * op.pprice)-(op.discount/100)) as SubTotal, 
SUM((op.amount * op.pprice)-(op.discountf/100)) as SubTotal2,
SUM(p.weight * o.shipping) as Shipping_Charges,
SUM(SubTotal + SubTotal2 + Shipping_Charges)) as o
inner join users AS u ON o.U_ID = u.id
WHERE u.country != 'NL';

-- 申し訳ありませんが、現在 3 つの内部結合があることに気付きました。これらすべての合計を別の表に集計します。

SELECT Order Number Order ID Order Date from Orders as O inner join Order Products as OP ON Order ID = Order Product ID または Order ID のいずれか、SUM(小計)、Order ID でグループ化。

これらのフィールドを保持するテーブルを作成し、注文番号または注文 ID に対応する user_ID で内部結合を実行します。結合を容易にするためにどこかに外部キーが必要です。

SELECT Order Id, Order Number, Order DATE, Order Shipping, Order Product, Order Amount, SUM(Order SubTotal) FROM Orders_Total 内部でユーザーを U on o.U_ID = u.id として結合

クライアントが実行できるフロントエンドのように聞こえる丸めやグループ変換は考慮していませんが、計算は単純ですが、クエリが本当に好きです。それを分解しようとしています.すみません、ここにたくさんあります。

于 2012-06-11T15:46:51.947 に答える