2013-02-07 40 views
2

需要使用MS SQL 2008和存儲過程。基於子選擇結果的T-sql更新值

所以在我的表中,我有一些行的IsDouble值將是2. 現在我需要更新IsDouble從2到1,從第一個選擇的每一行如果字符串的計數(從4列連接)更大大於1,且如果字符串的數量是1比0

到目前爲止,我有這一點,但它是最有可能不正確:

select * from TestInvoiceData where Isdouble='2'; 
update TestInvoiceData 
set testinvoicedata.Isdouble= 
case 
    when 
    (
     select COUNT (InvoiceDate+InvoiceNumber+VendorCode+Invoicetype) 
     from  TestInvoiceData 
    ) >1 then 1 
    else 0 
end; 

編輯

這裏的樣本數據(invoicetype,invoicenumber,invoicedate ,vendorcode):

INVO 322760-262 2012-05-10 0000081964 2 
INVO 322760-262 2012-05-10 0000081964 0 
INVO 322756-262 2012-05-10 0000081964 2 
INVO 7011200072 2012-05-10 0000046172 0 
INVO 7011200071 2012-05-10 0000046172 0 
INVO 7011200070 2012-05-10 0000046172 0 
INVO 7011200069 2012-05-10 0000046172 0 
INVO 7011200068 2012-05-10 0000046172 0 
INVO 12106563 2012-04-24 0000010171 0 
INVO 06649  2012-04-24 0000067987 0 

,並在此基礎上例中第一行應該更新1後,第三個0

+2

你需要給樣本數據......這樣的查詢 – Justin

+1

你命名字段'Isdouble'這不是一個'布爾/ bit'? –

+0

它不是布爾/位,它的nchar,我將添加樣本數據 – user1371966

回答

2

查詢:

SQLFIDDLEEXAmple

UPDATE TestInvoiceData 
SET Isdouble = (
SELECT CASE WHEN count(*)>1 THEN 1 
     ELSE 0 END AS cnt 
FROM TestInvoiceData t1 
    WHERE t1.invoicetype =TestInvoiceData.invoicetype 
    AND t1.invoicenumber = TestInvoiceData.invoicenumber 
    AND t1.invoicedate = TestInvoiceData.invoicedate 
    AND t1.vendorcode = TestInvoiceData.vendorcode 
GROUP BY t1.invoicetype, 
     t1.invoicenumber, 
     t1.invoicedate, 
     t1.vendorcode) 
WHERE Isdouble = '2' 

結果:

| INVOICETYPE | INVOICENUMBER |     INVOICEDATE | VENDORCODE | ISDOUBLE | 
-------------------------------------------------------------------------------------- 
|  INVO | 322760-262 | May, 10 2012 00:00:00+0000 |  81964 |  1 | 
|  INVO | 322760-262 | May, 10 2012 00:00:00+0000 |  81964 |  0 | 
|  INVO | 322756-262 | May, 10 2012 00:00:00+0000 |  81964 |  0 | 
|  INVO | 7011200072 | May, 10 2012 00:00:00+0000 |  46172 |  0 | 
|  INVO | 7011200071 | May, 10 2012 00:00:00+0000 |  46172 |  0 | 
|  INVO | 7011200070 | May, 10 2012 00:00:00+0000 |  46172 |  0 | 
|  INVO | 7011200069 | May, 10 2012 00:00:00+0000 |  46172 |  0 | 
|  INVO | 7011200068 | May, 10 2012 00:00:00+0000 |  46172 |  0 | 
|  INVO |  12106563 | April, 24 2012 00:00:00+0000 |  10171 |  0 | 
|  INVO |   06649 | April, 24 2012 00:00:00+0000 |  67987 |  0 | 
+0

謝謝大家! – user1371966

0

我猜你需要

update TestInvoiceData set 

Isdouble=CASE 
      WHEN (select count(*) from TestInvoiceData as Tid 
        where 
        tId.InvoiceDate=InvoiceDate 
        AND 
        tId.InvoiceNumber=InvoiceNumber 
        AND 
        tId.VendorCode=VendorCode 
        AND 
        tId.Invoicetype =Invoicetype 
       ) > 1 
       THEN 1 
       ELSE 0 
      END 

where Isdouble=2