2016-10-04 17 views
0

ユーザーが入力したUSERIDとCREATION_DATEを持つIDとNUMのカウントであるレポートサービスに戻そうとしています。 私の目的は、両方のカウントを含む1つの行を結果として得ることです。私は正確にカウントを取得していますが、私は リターンとしていくつかの行で表示されています。 (ユーザーによって指定されたパラメータを持つ行です)。 COUNTIDとCOUNTNUMフィールドのみを含む行を1つだけ取得するにはどうすればよいですか。 私はMicrosoft SQL Serverを使用しています。Sqlクエリの正しい構文

SELECT 

    (SELECT COUNT(ID) 
     FROM PART 
     WHERE USERID = $P{userId} and CREATION_DATE = $P{creationDate}) as COUNTID , 
    (SELECT COUNT(NUM) 
     FROM IDENTITY 
     WHERE USERID = $P{userId} and CREATION_DATE = $P{creationDate}) as COUNTNUM 
FROM 
     PART, 
     IDENTITY 
+1

あなたのバックエンドデータベースは、SQL ServerまたはそれがOracleの場合は代わりにDUAL' FROM '使用している場合は' FROM'句を削除してください。 – Unoembre

+1

使用するDBエンジンを指定できますか? – Gasper

+0

いずれかまたは両方のCOUNTがゼロになることはありますか?この場合、提供される回答の一部が機能しません。 – Unoembre

答えて

1

あなたが一列のみを返すようにしたい場合は、あなたとサブクエリのそれぞれが戻っているあなただけの外側のクエリからFROM句を削除することができ、あなたが望む「カウント」。このようなもの:

SELECT (SELECT COUNT(p.ID) 
      FROM PART p 
      WHERE p.USERID  = $P{userId} 
       AND p.CREATION_DATE = $P{creationDate} 
     ) AS COUNTID 
     , (SELECT COUNT(i.NUM) 
      FROM IDENTITY i 
      WHERE i.USERID  = $P{userId} 
       AND i.CREATION_DATE = $P{creationDate} 
     ) AS COUNTNUM 

個人的には、私は少し異なってクエリを書いています。サブラインを使用するには、インライン・ビューがFROM句にクロス・ジョインされ、インライン・ビューのそれぞれが単一の行を戻します。このように:

SELECT cp.countid 
     , ci.countnum 
    FROM (SELECT COUNT(p.ID) AS countid 
      FROM PART p 
      WHERE p.USERID  = $P{userId} 
       AND p.CREATION_DATE = $P{creationDate} 
     ) cp 
    CROSS 
    JOIN (SELECT COUNT(i.NUM) AS countnum 
      FROM IDENTITY i 
      WHERE i.USERID  = $P{userId} 
       AND i.CREATION_DATE = $P{creationDate} 
     ) ci 
+0

サブクエリが行を返すことが保証されていることに注意してください。述語を満たす行がない場合でも、COUNT()集計は0を返します。この回答の2つのクエリはすべて「ゼロ」カウントを返します。 – spencer7593

0

参加し、グループ化を使用する - このように:サイドボーナスとして

SELECT P.USERID, P.CREATION_DATE, COUNT(P.ID) AS COUNTID, COUNT(I.NUM) AS COUNTNUM 
FROM PART P 
JOIN IDENTITY I ON P.USERID = I.USERID AND P.CREATION_DATE = I.CREATION_DATE 
WHERE P.USERID = $P{userId} and P.CREATION_DATE = $P{creationDate} 
GROUP BY P.USERID, P.CREATION_DATE 

あなたが取る場合WHEREあなたはすべてのユーザーとすべての日付の結果を見ることができます。この2番目のクエリは、ずっとより正確であるが、応じて必要とされないことがあります。

SELECT B.USERID, B.CREATION_DATE, COUNT(P.ID) AS COUNTID, COUNT(I.NUM) AS COUNTNUM 
FROM (
    SELECT DISTINCT USERID, CREATEION_DATE FROM PART 
    UNION 
    SELECT DISTINCT USERID, CREATEION_DATE FROM IDENTITY 
) AS B 
LEFT JOIN PART P ON B.USERID = P.USERID AND B.CREATION_DATE = P.CREATION_DATE 
LEFT JOIN IDENTITY I ON B.USERID = I.USERID AND B.CREATION_DATE = I.CREATION_DATE 
WHERE B.USERID = $P{userId} and B.CREATION_DATE = $P{creationDate} 
GROUP BY B.USERID, B.CREATION_DATE 

注:いないすべてのユーザーと日付がPARTテーブルやアイデンティティテーブル内にある場合、

注、これを行いますあなたのデータにデータやデータモデルについて何も教えてくれないので、最初のクエリが機能するかどうかを知ることは難しいです。

+0

あなたの2番目のソリューションになると、私は1つの行を取得しています。しかし、私の正しい解決策である1,7を得る代わりにカウントするために...私は各カウントごとに14を得ています – user243837

+0

@ user243837 - 'UNION ALL'を' UNION'に変更しようとしてください。それがうまくいかない場合は、何が間違っているか把握するためにサンプルデータを確認する必要があります。 – Hogan

+0

これを行うことによってカウントは現在COUNTID 7 COUNTNUM 7です。Countnumは正しいですが、countidは1でなければなりません。 – user243837