0

さて、以下のステートメントでは、最初に選択されたものを最初のフィールドとして取得し、追加のフィールドとして使用されている2つのselectステートメントに表示されるpi.planinfoid代わりに動的変数にしようとしています。1736

また、値が0またはnullの場合でも、2つのselectステートメントによって生成された2つのフィールドを返すためにも必要です。

誰かがこれを理解することができれば、私は事前に感謝します。

SELECT  pi.planinfoid,
        pi.description,
        count(DISTINCT p.planid) AS total,
        sum(dm.debitamount) AS Num,
        pi.minperiod,
        (
            SELECT count(p.planid)
            FROM plans p,
                    planinfo pi
            WHERE pi.planinfoid = p.planinfoid
                    AND pi.planinfoid = '1736'
                    AND p.closed = 0
        ) AS opened,
        (
            SELECT count(p.planid)
            FROM plans p,
                    planinfo pi
            WHERE pi.planinfoid = p.planinfoid
                    AND pi.planinfoid = '1736'
                    AND p.closed = 1
        ) AS closedd
FROM    planinfo pi, plans p, debitmovements dm
WHERE   pi.price > 0
        AND p.planinfoid = pi.planinfoid
        AND dm.planid = p.planid
        AND p.servicestart BETWEEN '2012-01-01' AND '2013-01-01'
GROUP BY    pi.description,
            pi.minperiod,
            pi.planinfoid
ORDER BY total DESC

それは実行されましたが、とにかくオープンとクローズが総数に結びついているようには見えません、

planid  plan descrip   min      TOTAL   PRICE   OPEN    CLOSE
1736    Additional IP   1   146 1926    101 545

技術的には、その期間の売りの合計が146の場合、101を開いたままにし、545を閉じることはできません。おそらく、その期間に開いたものだけについて、プルされていない数が開いたり閉じたりします。146オープンの一意のフィールドはp.planidであるか、またはそれぞれが基本的に一意のp.planidを持ちますが、これまでのところ素晴らしい仕事です。

4

2 に答える 2

1

これを試して:

SELECT
  pi.planinfoid, 
  pi.description, 
  pi.minperiod,
  count(DISTINCT p.planid) AS total,
  sum(dm.debitamount) AS Num, 
  SUM(CASE WHEN p.closed = 0 THEN 1 ELSE 0 END) AS opened,
  SUM(CASE WHEN p.closed = 1 THEN 1 ELSE 0 END) AS closedd
FROM planinfo pi  
INNER JOIN plans           p ON p.planinfoid = pi.planinfoid
INNER JOIN debitmovements dm ON dm.planid    = p.planid 
WHERE pi.price > 0
  AND p.servicestart BETWEEN '2012-01-01' 
                         AND '2013-01-01'
GROUP BY pi.description,
         pi.minperiod,
         pi.planinfoid 
ORDER BY total DESC;

私がここで行ったことは次のとおりです。

  • JOIN古い構文の代わりに、ANSI-92 SQL 標準の暗黙的な構文を使用しました。
  • COUNT()相関する 2 つのサブクエリを 2 つの式に置き換えましたCASE
  • 節に移動pi.planinfoid = 1736しましたが、式条件WHEREに入れることができます。CASE
  • planinfoidの代わりに探しているを渡す必要があります@value
于 2013-01-10T15:09:14.317 に答える
0

グループ化条件をカウントに適用する必要があるかどうかを判断するのは困難です。カウントを明示的にするには、サブクエリを使用できます。

SELECT  pi.planinfoid,
        pi.description,
        count(DISTINCT p.planid) AS total,
        sum(dm.debitamount) AS Num,
        pi.minperiod,
        max(opened) as opened,
        max(closed) as closed
FROM    planinfo pi join
        plans p
        on p.planinfoid = pi.planinfoid join
        debitmovements dm
        on dm.planid = p.planid left outer join
        (select planinfoid, SUM(1-p.closed) as opened, SUM(p.closed) as closed
         from planinfo pi join
              plans p
              on pi.planinfoid = p.planinfoid
         group by planinfoid
        ) psum
        on psum.planinfoid = psum.planinfoid
WHERE   pi.price > 0 AND
        p.servicestart BETWEEN '2012-01-01' AND '2013-01-01'
GROUP BY    pi.description,
            pi.minperiod,
            pi.planinfoid
ORDER BY total DESC

ただし、質問のコンテキストでは、内部サブクエリに異なるエイリアスを与えることで、必要なことを行います。

    (
        SELECT count(p2.planid)
        FROM plans p2 join
             planinfo pi2
             on pi2.planinfoid = p2.planinfoid
        WHERE
                pi2.planinfoid = pi.planinfoid
                AND p2.closed = 0
    ) AS opened,
于 2013-01-10T15:15:12.087 に答える