0

SQL クエリに問題があるので、何をしたいのか説明しようと思います。これは、いくつかの結果行を返す私のクエリです。

SELECT 
sck.sckid,
sck.prid,
sck.paid,
sck.sckcen,
sum(scd.scdkiek) as count_of_goods,
min(scn.scndat) as `date`
FROM sck 
INNER JOIN scd ON scd.sckid = sck.sckid
INNER JOIN scn ON scn.scnid = scd.scnid
INNER JOIN sandeliai ON sandeliai.paid = sck.paid
WHERE sck.prid = 1376 GROUP BY sckid

そして、このクエリは結果の「表 1」を返します。

表1:

sckid    |    prid    |    sckcen    |    count_of_goods    |      date     |
123      |    1376    |    10009     |          0           |   2012-12-31  |
124      |    1376    |    10007     |          15          |   2013-01-25  |
125      |    1376    |    10005     |          0           |   2013-02-13  |
126      |    1376    |    10000     |          18          |   2013-03-15  |

しかし、すべてのデータを でグループ化した 1 行だけが必要なのでprid、次のクエリを書きました。

SELECT 
sck.sckid,
sck.prid,
sck.paid,
sck.sckcen,
sum(scd.scdkiek) as count_of_goods,
min(scn.scndat) as `date`
FROM sck 
INNER JOIN scd ON scd.sckid = sck.sckid
INNER JOIN scn ON scn.scnid = scd.scnid
INNER JOIN sandeliai ON sandeliai.paid = sck.paid
WHERE sck.prid = 1376 GROUP BY prid

次に、テーブルにこのデータを含む 1 つの行を取得します。

表 2:

sckid    |    prid    |    sckcen    |    count_of_goods    |      date     |
123      |    1376    |    10009     |          23          |   2012-12-31  |

それはすべて正しいようですが、dateフィールドでは、count_of_goods > 0 を持つテーブル 1 から最も早い日付を返す必要があるため、次の結果が必要です。

表 3:

sckid    |    prid    |    sckcen    |    count_of_goods    |      date     |
123      |    1376    |    10009     |          23          |   2013-01-25  |

では、表 3 のような結果を得るにはどうすればよいでしょうか?

4

3 に答える 3

1

私が最初に戻ってきた答えは、非常に複雑すぎるかもしれないと思います。scd.scdkiek が数値で ID ではないと仮定すると、INNER JOIN 条件を変更するだけで必要なものを取得できます。つまり、

SELECT 
    sck.sckid,
    sck.prid,
    sck.paid,
    sck.sckcen,
    scn.scndat,
    SUM(scd.scdkiek) AS count_of_goods
FROM sck 
INNER JOIN scd 
    ON scd.sckid = sck.sckid
    AND scd.scdkiek > 0
INNER JOIN sandeliai 
    ON sandeliai.paid = sck.paid
INNER JOIN scn 
    ON scn.scnid = scd.scnid
WHERE sck.prid = 1376 
GROUP BY 
    sck.prid

それができない場合は、サブクエリの使用を検討します。サブクエリは、行ごとに count_of_goods を計算します。外側のクエリはこれを使用して、その行の日付を NULL に設定するかどうかを決定します。MIN(...somedate...,NULL) は日付を返します。これは、その行の count_of_goods が NULL でない最小の日付を取得する必要があることを意味します。

count_of_goods が > 0 である日付を探しているため、サブクエリは日付でグループ化されます。

もちろん、これは 1 つのオプションにすぎません。他のより効率的な方法があるかもしれませんが、これはあなたが目指しているとおりになると思います

SELECT
    sck.sckid,
    sck.prid,
    sck.paid,
    sck.sckcen,
    SUM(d.count_of_goods) AS count_of_goods,
    MIN(IF(d.count_of_goods>0,d.scndat,NULL)) AS `date`
FROM (
    -- Get the data and group it by date
    SELECT 
        sck.sckid,
        sck.prid,
        sck.paid,
        sck.sckcen,
        scn.scndat,
        SUM(scd.scdkiek) AS count_of_goods
    FROM sck 
    INNER JOIN scd ON scd.sckid = sck.sckid
    INNER JOIN sandeliai ON sandeliai.paid = sck.paid
    INNER JOIN scn ON scn.scnid = scd.scnid
    WHERE sck.prid = 1376 
    GROUP BY 
        sck.prid, -- may not really be needed
        scn.scndat
) AS d
GROUP BY d.prid
于 2013-04-24T08:56:04.647 に答える
0

今、私の質問はあまり論理的ではありませんでした。質問で両方のクエリを組み合わせようとすると、良い答えが得られます。これが私の解決策です。

SELECT 
sck.sckid,
sck.prid,
sck.paid,
sck.sckcen,
sum(scd.scdkiek) as count_of_goods,
(SELECT 
scn.scndat
FROM sck 
INNER JOIN scd ON scd.sckid = sck.sckid
INNER JOIN scn ON scn.scnid = scd.scnid
WHERE sck.prid = 1376 GROUP BY sck.sckid having sum(scd.scdkiek) > 0 ORDER BY scn.scndat LIMIT 1) as `date`
FROM sck 
INNER JOIN scd ON scd.sckid = sck.sckid
INNER JOIN scn ON scn.scnid = scd.scnid
WHERE sck.prid = 1376 GROUP BY prid; 
于 2013-04-24T07:34:39.267 に答える