2013-12-12 26 views
1

我想根據customer_code列品牌列根據「true」或「false」結果更新品牌A,品牌B和品牌C列。使用true或false更新sql列

例如,表市場顯示以下內容: 我有一個客戶誰買品牌A和B:

Customer_code Brand Brand A Brand B Brand C 
1234567   A NULL NULL NULL 
1234567   B NULL NULL NULL 


Customer_code Brand Brand A Brand B Brand C 
1234567   A  True True False 
1234567   B  True True False 

由於我有相當大量的數據那麼有沒有什麼辦法能解決這個?

非常感謝!

+0

你試過張貼問題之前任何疑問? –

+0

是的!你可以寫簡單的sql更新查詢。 – Hardy

+1

當你開始銷售第四品牌時會發生什麼?您是否要在名爲「品牌D」的表格中添加一個新列?如果是這樣,你的設計是有缺陷的。 – gvee

回答

0

使用子查詢:

UPDATE m 
SET Brand_A = CASE WHEN EXISTS(SELECT 1 FROM dbo.Market m2 
           WHERE m.Customer_code = m2.Customer_code 
           AND m2.Brand = 'A') THEN 1 ELSE 0 END, 
    Brand_B = CASE WHEN EXISTS(SELECT 1 FROM dbo.Market m2 
           WHERE m.Customer_code = m2.Customer_code 
           AND m2.Brand = 'B') THEN 1 ELSE 0 END, 
    Brand_C = CASE WHEN EXISTS(SELECT 1 FROM dbo.Market m2 
           WHERE m.Customer_code = m2.Customer_code 
           AND m2.Brand = 'C') THEN 1 ELSE 0 END 
FROM dbo.Market m 

Demo

2

有一個在存儲數據的大量或冗餘這種方式:

Customer_code Brand Brand A Brand B Brand C 
1234567   A  True True False 
1234567   B  True True False 

存儲,這將僅僅是正常的方式:

Customer_code Brand 
1234567   A  
1234567   B 

由於您的真/假列是基於前兩個數據的,因此存儲它們是一個壞主意,因爲您有額外的任務來保持它們的準確性。

想象我插入一個新行到表,即使我對每個品牌的正確的真/假值插入,但它仍然會使得前兩行錯誤:

Customer_code Brand Brand A Brand B Brand C 
1234567   A  True True False 
1234567   B  True True False 
1234567   C  True True True 

正如我有人說,我會建議只存儲customer_code和品牌,其餘的可以從這兩列中計算出來。最後,我還建議使用BIT DataType表示布爾值,而不是將文本存儲爲true或false(在SQL Server中沒有布爾類型)。所以,你可以創建一個視圖:

SELECT pvt.Customer_Code, 
     [Brand A] = CAST(CASE WHEN pvt.[A] > 0 THEN 1 ELSE 0 END AS BIT), 
     [Brand B] = CAST(CASE WHEN pvt.[B] > 0 THEN 1 ELSE 0 END AS BIT), 
     [Brand C] = CAST(CASE WHEN pvt.[C] > 0 THEN 1 ELSE 0 END AS BIT) 
FROM ( SELECT Customer_Code, Brand, Value = 1 
      FROM T 
     ) T 
     PIVOT 
     ( COUNT(Value) 
      FOR Brand IN ([A], [B], [C]) 
     ) pvt; 

這給出了結果:

Customer_code | Brand A | Brand B | Brand C 
--------------+---------+---------+---------- 
1234567  |  1 |  1 |  0 

Example on SQL Fiddle

它不具備品牌欄目,但這是多餘的,因爲品牌是由每個品牌的位列所暗示,因此包括該品牌只會導致重複的行。

最後,要真正回答你的問題,你可以使用下面的實際做您的更新:

WITH PVT AS 
( SELECT Customer_Code, [A], [B], [C] 
    FROM ( SELECT Customer_Code, Brand, Value = 1 
       FROM T 
      ) T 
      PIVOT 
      ( COUNT(Value) 
       FOR Brand IN ([A], [B], [C]) 
      ) pvt 
) 
MERGE T 
USING PVT 
    ON PVT.Customer_Code = T.Customer_Code 
WHEN MATCHED THEN UPDATE 
    SET [Brand A] = CASE WHEN pvt.A > 0 THEN 'True' ELSE 'False' END, 
     [Brand B] = CASE WHEN pvt.B > 0 THEN 'True' ELSE 'False' END, 
     [Brand C] = CASE WHEN pvt.C > 0 THEN 'True' ELSE 'False' END; 

Example on SQL Fiddle

或語法的SQL Servier公司具體更新/:

WITH PVT AS 
( SELECT Customer_Code, [A], [B], [C] 
    FROM ( SELECT Customer_Code, Brand, Value = 1 
       FROM T 
      ) T 
      PIVOT 
      ( COUNT(Value) 
       FOR Brand IN ([A], [B], [C]) 
      ) pvt 
) 
UPDATE T 
SET  [Brand A] = CASE WHEN pvt.A > 0 THEN 'True' ELSE 'False' END, 
     [Brand B] = CASE WHEN pvt.B > 0 THEN 'True' ELSE 'False' END, 
     [Brand C] = CASE WHEN pvt.C > 0 THEN 'True' ELSE 'False' END 
FROM T 
     INNER JOIN PVT 
      ON PVT.Customer_Code = T.Customer_Code;   

Example on SQL Fiddle

0
create table market 
(customer_code varchar(200), 
brand char(1), 
brand_a int, 
brand_b int, 
brand_c int 
); 

insert into market values('1234567','A',0,0,0); 
insert into market values('1234567','B',0,0,0); 

UPDATE market 
SET brand_a = a, brand_b = b, brand_c = c 
FROM 
(
SELECT customer_code c_code, 
MAX(CASE WHEN brand = 'A' THEN 1 ELSE NULL END) over(PARTITION by customer_code) a, 
MAX(CASE WHEN brand = 'B' THEN 1 ELSE NULL END) over(PARTITION by customer_code) b, 
MAX(CASE WHEN brand = 'C' THEN 1 ELSE NULL END) over(PARTITION by customer_code) c 
FROM market 
) aa 

WHERE customer_code = c_code; 

療法另一件事是刪除不需要的列,只是存儲客戶和品牌的分貝,後來只使用查詢:

SELECT 
    customer_code, 
    MAX(CASE WHEN brand='A' THEN 1 ELSE 0 END) AS brand_a, 
    MAX(CASE WHEN brand='B' THEN 1 ELSE 0 END) AS brand_b, 
    MAX(CASE WHEN brand='C' THEN 1 ELSE 0 END) AS brand_c 
    FROM market 
    GROUP BY customer_code;