2016-05-03 11 views
-1
SELECT 
    CASE 
     WHEN Employees.first_name IS NULL 
     OR Employees.first_name = 'x' THEN Employees.last_name 
     WHEN Employees.credentials IS NULL THEN Employees.last_name + ', ' + Employees.first_name 
     ELSE Employees.last_name + ', ' + Employees.first_name + ' - ' + Employees.credentials 
    END, 
    Employees.num3, 
    Employees.address1 + ' ' + Employees.city + ', ' + Employees.state + ' ' + Employees.zip, 
    Employees.work_phone, 
    CASE 
     WHEN Clients.age <= 18 THEN 'Youth' 
     ELSE 'Adult' 
    END, 
    Clients.client_id, 
    Clients.last_name + ', ' + Clients.first_name, 
    ClientVisit.cptcode, 
    ClientVisit.visittype, 
    ClientVisit.rev_timeout, 
    ClientVisit.timein, 
    ClientVisit.duration, 
    SUM(CASE 
     WHEN ClientVisit.cptcode = 90791 THEN 200 
     WHEN ClientVisit.comb_units = 1 THEN 85.67 
     ELSE ClientVisit.comb_units * 21.4175 
    END), 
    DATEDIFF(d, ClientVisit.rev_timeout, ClientVisit.signature_datetime) 
FROM dbo.ClientVisit 
INNER JOIN dbo.Employees 
ON (
    ClientVisit.by_emp_id = Employees.emp_id 
) 
INNER JOIN dbo.Programs 
ON (
    ClientVisit.program_id = Programs.program_id 
) 
INNER JOIN dbo.Clients 
ON (
    Clients.client_id = ClientVisit.client_id 
) 
WHERE (
    ClientVisit.rev_timeout BETWEEN '20160401 11:40:00.000' AND '20160415 11:40:16.000' 
    AND Programs.program_desc IN ('Off Panel') 
    AND ClientVisit.non_billable = 0 
    AND ClientVisit.cptcode NOT IN ('00000', '0124', '100', '1001', '101', '102', '103', '80100', '9079', '99999') 
    AND Employees.num3 IS NOT NULL 
) 
GROUP BY 
    CASE 
     WHEN Clients.age <= 18 THEN 'Youth' 
     ELSE 'Adult' 
    END, 
    CASE 
     WHEN Employees.first_name IS NULL 
     OR Employees.first_name = 'x' THEN Employees.last_name 
     WHEN Employees.credentials IS NULL THEN Employees.last_name + ', ' + Employees.first_name 
     ELSE Employees.last_name + ', ' + Employees.first_name + ' - ' + Employees.credentials 
    END, 
    DATEDIFF(d, ClientVisit.rev_timeout, ClientVisit.signature_datetime), 
    ClientVisit.cptcode, 
    Clients.last_name + ', ' + Clients.first_name, 
    Clients.client_id, 
    Employees.address1 + ' ' + Employees.city + ', ' + Employees.state + ' ' + Employees.zip, 
    Employees.work_phone, 
    ClientVisit.duration, 
    ClientVisit.visittype, 
    ClientVisit.rev_timeout, 
    ClientVisit.timein, 
    Employees.num3 

をintへのvarcharは私にエラーを与える:CASE文:一貫性のない変換がエラーに失敗 -

Conversion failed when converting the varchar value 'H2019' to data type int.

私はこの変換が行われていると何が可能に修正することができどこ具体的に見つけることができませんよ。

EDIT:英数字のエントリを持つcptcode列に問題があります。ただし、WHERE句の日付範囲を変更すると、日付によっては結果が得られますが、他の日付では結果が得られません。

+1

まあ、彼らは不要だ、彼らはすべてで任意の値を追加し、ちょうどはるかに困難.... –

+1

は明確な選択 '絶対に使用しないでくださいというクエリを読ん作らないのに役立ちます希望は、 'と' group by'を1回選択するだけで、何も成し遂げられないように区別できます。 –

答えて

2

90791のデータ型は整数になります。

"ClientVisit"."cptcode" = '90791' 

と交換すると、両辺が文字になります。あなたの問題のため

"ClientVisit"."cptcode" = CAST(90791 AS VARCHAR(20)) 

な理由SQL Serverがimplicit conversionを行うということです:あなたはまた、のような何かを行うことができます。この場合、Integerとしての整数は(n)(var)charデータ型よりも高いData Type Precedenceです。

もちろん私はあなたのデータを知らないが、私はcptcodeの数値だけがあるデータ範囲があると思う。だからあなたのコードはそれらのために働くが、例えばあなたが何かのようなものを打つならばH006

;-)

+0

ありがとうございました。します! :) – AS91

2

selectセグメント内のすべての列をコメント化し、selectを毎回実行しながら1つずつコメントを開始します。問題のある行のコメントを外すと、エラーの原因が見つかります。

私は問題があると推測しています。です。あなたは

"ClientVisit"."cptcode" = 90791 

を使用する場合

+0

これが問題です。私は1つのアルファベットの後ろに4つの数字が続くいくつかのcptcodesを持っています。例:H006、G0409など。このケースステートメントを自分のフィールドでこのようなデータと連動させるにはどうすればよいですか? – AS91

+0

奇妙なのは、WHERE句のrev_timeout範囲を2016年4月4日より後の日付以外の日付範囲に変更すると、クエリが実行されるということです。 cptcodeにはまだ英数字コードがあります。 CASE文のすべての結果式は同じデータ型でなければならないことは私の理解であった。これは変換エラーの原因となる可能性があります。しかし、日付の範囲の変更が機能するようになると、エラーは一貫していません。理由は何でしょうか? – AS91

+0

日付範囲が異なると、 'cptcode'カラムに値のセットが異なります。列の値にアルファ値が含まれていないことがあります。 –

関連する問題