有一個在存儲數據的大量或冗餘這種方式:
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
你試過張貼問題之前任何疑問? –
是的!你可以寫簡單的sql更新查詢。 – Hardy
當你開始銷售第四品牌時會發生什麼?您是否要在名爲「品牌D」的表格中添加一個新列?如果是這樣,你的設計是有缺陷的。 – gvee