2017-12-14 7 views
0

ここに私の問題があります:条件SQLでSQL句を使用する方法

一致する行ごとにデータベースの最初の結果を取得する必要があります。私は多数の行を取得しています。

元のクエリはお客様IDごとに複数行を返します。最初の行を取得するために、私は彼らに番号をと考えましたとばかりだからここに1の番号を付けたものを取る、だから、

select distinct b.custid, name 
     FROM mth_Charge_Records a 
     join mth_header b on b.id = a.headerid  

をそのクエリであります:

select distinct b.custid, name, 
     count(custid) OVER (order by custid rows unbounded preceding) as custcount 
    FROM mth_Charge_Records a 
    join mth_header b on b.id = a.headerid  

これは機能し、行番号は数えられません。だから、私は条件としてcustcountを追加しようと、それは失敗します。

select distinct b.custid, name, 
     count(custid) OVER (order by custid rows unbounded preceding) as custcount 
    FROM mth_Charge_Records a 
    join mth_header b on b.id = a.headerid  
    where custcount = 1 <<--- Added this line 

今私はcustcountが無効列であることをエラーを取得しています。

ご意見やご感想をお寄せください。ありがとうございます:)

+1

使用しているRDMBSにタグを付けてください。 –

+4

countの代わりにrow_number()関数を使用してください。あなたのレコードを一時テーブルに挿入し、rownum 1を持つレコードのみを選択するか、CTEを使用する – Veljko89

+1

"最初の行"とは何ですか?これは、明確に定義された要件で、開始する必要がある場所です。 'custcount'は有効な列ではありません。なぜなら、SQL Serverはその名前の使用を要求される前にその列の名前を指定したクエリの部分を処理しなかったからです。その周りにはいくつかの方法がありますが、それらの要件に応じて最適です。 –

答えて

2

を見てSELECT (Transact-SQLを見てください。ステートメントのSELECT部分がの後にWHEREの後に評価されていることがわかります。つまり、別名でSELECTにある列を参照することはできません。

また、WHERE句内でウィンドウ関数を使用できないことに気づいたことがあります。あなたはCTEを使用することができますが、おそらく、あなたが実際に望んでいるのはHAVINGという句です。したがって:

SELECT mt.custid, 
     [name] 
FROM mth_Charge_Records mCR 
    JOIN mth_header mt on mCR.headerid = mt.id 
GROUP BY mt.custid, 
     [name] 
HAVING COUNT(mt.custid) = 1; 

編集:COUNTはmisguidanceのビット再読み込みした後でした。あなたは、CTEとROW_NUMBERをお勧めします:

WITH CTE AS(
    SELECT mt.custid, 
      [name], 
      ROW_NUMBER() OVER (ORDER BY mt.custid) AS RN 
    FROM mth_Charge_Records mCR 
    JOIN mth_header mt on mCR.headerid = mt.id) 
SELECT * 
FROM CTE 
WHERE RN = 1; 
+1

OPの行を読むと、「COUNT」は誤ったガイドです。私は更新しました。 – Larnu

1
Try this 
Select a.* 
From ( 
select distinct b.custid, name, 
     count(custid) OVER (order by custid rows unbounded preceding) as custcount 
    FROM mth_Charge_Records a 
    join mth_header b on b.id = a.headerid 
) a  
    where a.custcount = 1 
2

row_number()であなたの試みは任意の行を返します。それがあなたが望むだけなら、集約を使わないのはなぜですか?

select h.custid, max(crname) 
from mth_Charge_Records cr join 
    mth_header h 
    on h.id = cr.headerid;