2013-09-24 143 views
5

Hi mọi người tôi muốn sử dụng báo cáo trường hợp trong join sử dụng truy vấn này và đã nhận lỗiTrường hợp sử dụng Quy định trong tham

Select CONVERT(VARCHAR(10), SII.SIDATE,103)DATE,SII.SALEID,SII.ItemName,SI.TenancyID 

FROM F_SALESINVOICEITEM SII 
INNER JOIN F_SALESINVOICE SI ON SI.SALEID=SII.SALEID 
INNER JOIN #TempTableSearch ts ON CASE 
WHEN ts.ACCOUNTTYPE = '1' THEN ts.ACCOUNTID=SI.TENANCYID 
    WHEN ts.ACCOUNTTYPE='2' THEN ts.ACCOUNTID=SI.EMPLOYEEID 
    WHEN ts.ACCOUNTTYPE='3' THEN ts.ACCOUNTID=SI.SUPPLIERID 
    WHEN ts.ACCOUNTTYPE='4' THEN ts.ACCOUNTID=SI.SALESCUSTOMERID 

Lỗi

cú pháp sai gần '='.

Vui lòng giúp tôi giải quyết lỗi này.

Trả lời

13

CNTT nên được,

ON 
ts.ACCOUNTID = CASE 
        WHEN ts.ACCOUNTTYPE = '1' THEN SI.TENANCYID 
        WHEN ts.ACCOUNTTYPE = '2' THEN SI.EMPLOYEEID 
        WHEN ts.ACCOUNTTYPE = '3' THEN SI.SUPPLIERID 
        WHEN ts.ACCOUNTTYPE = '4' THEN SI.SALESCUSTOMERID 
       END 
0

Bạn có lỗi cú pháp. Bạn đang thiếu END ở đó.

6

Thay vì sử dụng CASE, tôi muốn có nhiều thay làm điều này:

Select CONVERT(VARCHAR(10), SII.SIDATE,103)DATE,SII.SALEID,SII.ItemName,SI.TenancyID 
FROM F_SALESINVOICEITEM SII 
INNER JOIN F_SALESINVOICE SI ON SI.SALEID=SII.SALEID 
INNER JOIN #TempTableSearch ts ON 
     (ts.ACCOUNTTYPE='1' AND ts.ACCOUNTID=SI.TENANCYID) 
    OR (ts.ACCOUNTTYPE='2' AND ts.ACCOUNTID=SI.EMPLOYEEID) 
    OR (ts.ACCOUNTTYPE='3' AND ts.ACCOUNTID=SI.SUPPLIERID) 
    OR (ts.ACCOUNTTYPE='4' AND ts.ACCOUNTID=SI.SALESCUSTOMERID) 

Để giải thích tại sao các truy vấn không làm việc cho bạn: cú pháp của CASE đòi hỏi một END vào cuối mệnh đề . Nó sẽ hoạt động, như các giải pháp khác được đề xuất, nhưng tôi thấy phiên bản này thuận tiện hơn để hiểu - mặc dù phần này rất có tính chủ quan.

+0

Bạn đã thực hiện truy vấn nhưng bạn không giải thích chính xác lý do lỗi là gì. – nimdil

1

bạn có thể làm điều này, vì vậy bạn không có cơ hội để đánh sai một cái gì đó (lưu ý rằng ACCOUNTTYPEACCOUNTID chỉ được sử dụng khi cần thiết, bạn không cần phải sao chép-dán)

select 
    convert(varchar(10), SII.SIDATE,103) as DATE, 
    SII.SALEID, SII.ItemName, SI.TenancyID 
from F_SALESINVOICEITEM as SII 
    inner join F_SALESINVOICE as SI on SI.SALEID = SII.SALEID 
    outer apply (
     '1', SI.TENANCYID 
     '2', SI.EMPLOYEEID 
     '3', SI.SUPPLIERID 
     '4', SI.SALESCUSTOMERID 
    ) as C(ACCOUNTTYPE, ACCOUNTID) 
    inner join #TempTableSearch as ts on 
     ts.ACCOUNTTYPE = C.ACCOUNTTYPE and ts.ACCOUNTID = C.ACCOUNTID 
0

Bạn phải hiểu rằng Khối CASE ... END KHÔNG tương đương với IF { } từ ngôn ngữ giống C. Khá nhiều điều này tương đương với phiên bản phức tạp của toán tử ... ? ... : ... từ các ngôn ngữ giống như C. Điều đó có nghĩa là khối WHOLE CASE về cơ bản phải đánh giá một giá trị duy nhất và giá trị này phải là cùng loại bất kể trường hợp nào của khối được thực hiện. Điều này có nghĩa rằng:

CASE 
WHEN ts.ACCOUNTTYPE = '1' THEN ts.ACCOUNTID=SI.TENANCYID ... 
END 

là về cơ bản không chính xác trừ khi bạn làm việc trên một phiên bản của cơ sở dữ liệu này sẽ cho phép bạn bool giá trị như một giá trị (SQL Server sẽ không cho phép nó ví dụ nhưng tôi nghĩ rằng một số phiên bản MySQL sử dụng để cho phép nó - không chắc chắn về điều này). Có lẽ bạn nên viết một cái gì đó như:

CASE 
WHEN ts.ACCOUNTTYPE = '1' AND ts.ACCOUNTID=SI.TENANCYID THEN 1 
WHEN ts.ACCOUNTTYPE='2' AND ts.ACCOUNTID=SI.EMPLOYEEID THEN 1 
WHEN ts.ACCOUNTTYPE='3' AND ts.ACCOUNTID=SI.SUPPLIERID THEN 1 
WHEN ts.ACCOUNTTYPE='4' AND ts.ACCOUNTID=SI.SALESCUSTOMERID THEN 1 
ELSE 0 
END = 1 

Thông báo như thế nào toàn bộ CASE khối đánh giá đến 1 hoặc 0 và sau đó nó được so sánh với 1. Dĩ nhiên thay vì 4 WHEN 's bạn có thể sử dụng một trong WHEN với sự kết hợp của AND của, OR() dấu ngoặc vuông. Tất nhiên trong trường hợp này câu trả lời cụ thể bởi @ peterka 66 là chính xác như CASE là không thích hợp cho những gì bạn thực sự muốn làm - Tôi chỉ cố gắng làm rõ những gì CASE thực sự là.