2010-02-22 6 views
5

यह शायद एक बहुत ही सरल सवाल है। मैं वास्तव में ऐसा करना चाहता हूं कि स्तंभ को एक पंक्ति में बनाना है जिसका डेटा प्रकार थोड़ा सा है।SQL सर्वर में बिट बिटटाइप पर आप कैसे PIVOT करते हैं?

एसयूएम, MIN, MAX बिट्स पर काम नहीं करता है। COUNT काम करता है लेकिन मैं वास्तव में गिनना नहीं चाहता। मैं बस कॉलम से सभी चीजों को पंक्तियों में ले जाना चाहता हूं जैसे कि मैंने कैंची की एक जोड़ी ली, जानकारी काट दिया और इसे -90 डिग्री ले जाया।

+0

मुझे लगता है कि हम अंक बना सकते हैं या दूसरों की मदद करने के लिए यहाँ कर रहे हैं? आप उन बिंदुओं को क्या बदल सकते हैं? – JonH

उत्तर

4

इसका समाधान बिट डेटा प्रकार को डेटा प्रकार में डालना है जो कुल कार्यों में स्वीकार किया जाता है। उदाहरण के लिए,

SELECT MAX(CAST(BitColumn AS TINYINT)) 

बिटकॉलम मान को एक छोटे से डेटाटाइप पर रखता है। कथन 1 लौटाता है यदि बिटकॉलम में कम से कम 1 मान होता है; अन्यथा, यह 0 देता है (जब तक कि सभी मान शून्य न हों)।

मान लिया जाये कि निम्नलिखित:

CREATE TABLE MyTable (ID INT, Name VARCHAR(10), BitColumn BIT); 

INSERT INTO MyTable VALUES (1, 'Name 1', 1); 
INSERT INTO MyTable VALUES (1, 'Name 2', 0); 
INSERT INTO MyTable VALUES (1, 'Name 3', 1); 
INSERT INTO MyTable VALUES (2, 'Name 1', 1); 
INSERT INTO MyTable VALUES (2, 'Name 2', 1); 
INSERT INTO MyTable VALUES (2, 'Name 3', 1); 
INSERT INTO MyTable VALUES (3, 'Name 1', 0); 
INSERT INTO MyTable VALUES (3, 'Name 2', 0); 
INSERT INTO MyTable VALUES (3, 'Name 3', 0); 

आप निम्न क्वेरी

SELECT ID, 
    CAST(MAX(CASE Name WHEN 'Name 1' THEN CAST(BitColumn AS TINYINT) ELSE NULL END) AS BIT) AS [Name 1], 
    CAST(MAX(CASE Name WHEN 'Name 2' THEN CAST(BitColumn AS TINYINT) ELSE NULL END) AS BIT) AS [Name 2], 
    CAST(MAX(CASE Name WHEN 'Name 3' THEN CAST(BitColumn AS TINYINT) ELSE NULL END) AS BIT) AS [Name 3] 
FROM MyTable 
GROUP BY ID 
ORDER BY ID 

इस मामले में उपयोग करते हुए इस डेटा पिवट कर सकते हैं, अधिकतम BitColumn मूल्य बिट करने के लिए tinyint से वापस बदल जाती है। यह आवश्यक नहीं है।

परिणाम

ID Name 1 Name 2 Name 3 
-------------------------- 
1 1  0  1 
2 1  1  1 
3 0  0  0 

एक वैकल्पिक क्वेरी, SQL सर्वर 2005 के लिए कर रहे हैं और बाद में, धुरी ऑपरेटर का उपयोग करता

SELECT ID, [Name 1], [Name 2], [Name 3] 
FROM 
    (
    SELECT ID, Name, CAST(BitColumn AS TINYINT) AS BitColumn 
    FROM MyTable 
    ) as SourceTable 
PIVOT 
(
MAX(BitColumn) FOR Name in ([Name 1], [Name 2], [Name 3]) 
) AS PivotTable 
+0

यह solutuon काम करता है। लेकिन जब आप क्वेरी निष्पादित करते हैं तो बिट मान वापस नहीं करेंगे। पिवट कॉलम डालने के लिए संभव है लेकिन जब यह एक गतिशील पिवट थोड़ा मुश्किल है। – Rapunzo

2
SELECT [1], [2], [3] 
FROM 
    (
    SELECT ID, CAST(BitColumn AS TINYINT) AS INTColumn 
    FROM MyTable 
    ) as SourceTable 
PIVOT 
(
MAX(INTColumn) FOR ID in ([1], [2], [3]) 
) AS PivotTable 
+0

यह solutuon काम करता है। लेकिन जब आप क्वेरी निष्पादित करते हैं तो बिट मान वापस नहीं करेंगे। – Rapunzo

संबंधित मुद्दे