2008-10-22 11 views
15

सभी की प्रतिक्रिया के लिए लाखों लोग धन्यवाद। दुर्भाग्यवश, मेरे समाधान पर कोई भी समाधान काम नहीं कर रहा है, और मेरा अनुमान है कि मैंने जो उदाहरण प्रदान किया है वह गड़बड़ है।एसक्यूएल: मैं केवल कुछ स्तंभों पर एक अद्वितीय मूल्य के साथ पंक्तियों को कैसे चुनूं?

तो मुझे दोबारा प्रयास करने दो।

मेरे तालिका इस प्रकार है:

contract project activity 
row1 1000 8000 10 
row2 1000 8000 20 
row3 1000 8001 10 
row4 2000 9000 49 
row5 2000 9001 49 
row6 3000 9000 79 
row7 3000 9000 78 

असल में, क्वेरी मैं तलाश कर रहा हूँ वापस होगा "2000,49" "अनुबंध, गतिविधि के लिए" क्योंकि केवल अनुबंध # 2000 से एक है, और केवल एक अद्वितीय गतिविधि मूल्य।

फिर, धन्यवाद अग्रिम में एक लाख, boroatel

+0

इस तालिका के लिए पीके क्या है? –

उत्तर

13

अपने नव उपलब्ध कराए गए आंकड़ों का उपयोग करने अपडेट किया गया:

समाधान मूल डेटा का उपयोग कर इस जवाब के अंत में पाया जा सकता है।

अपने नए डेटा का उपयोग करना:

DECLARE @T TABLE([contract] INT, project INT, activity INT) 
INSERT INTO @T VALUES(1000, 8000, 10) 
INSERT INTO @T VALUES(1000, 8000, 20) 
INSERT INTO @T VALUES(1000, 8001, 10) 
INSERT INTO @T VALUES(2000, 9000, 49) 
INSERT INTO @T VALUES(2000, 9001, 49) 
INSERT INTO @T VALUES(3000, 9000, 79) 
INSERT INTO @T VALUES(3000, 9000, 78) 

SELECT DISTINCT [contract], activity FROM @T AS A WHERE 
    (SELECT COUNT(DISTINCT activity) 
    FROM @T AS B WHERE B.[contract] = A.[contract]) = 1 

रिटर्न: 2000, 49

समाधान मूल डेटा का उपयोग कर

चेतावनी: निम्न समाधानों डेटा पहले में दिए गए का उपयोग करें सवाल और वर्तमान प्रश्न के लिए समझ में नहीं आता है। मैंने उन्हें केवल पूर्णता के लिए संलग्न किया है।

SELECT Col1, Count(col1) AS count FROM table 
GROUP BY col1 
HAVING count > 1 

यह आपको लगता है कि अलग नहीं हैं col1 में सभी मानों की सूची मिलना चाहिए। आप इसे एक टेबल var या temp तालिका में रख सकते हैं और इसके खिलाफ शामिल हो सकते हैं।

DECLARE @t TABLE(col1 VARCHAR(1), col2 VARCHAR(1), col3 VARCHAR(1)) 

INSERT INTO @t VALUES('A', 'B', 'C'); 
INSERT INTO @t VALUES('D', 'E', 'F'); 
INSERT INTO @t VALUES('A', 'J', 'K'); 
INSERT INTO @t VALUES('G', 'H', 'H'); 

SELECT * FROM @t 

SELECT col1, col2 FROM @t WHERE col1 NOT IN 
    (SELECT col1 FROM @t AS t GROUP BY col1 HAVING COUNT(col1) > 1) 

यह रिटर्न:

D E 
G H 

और किसी अन्य विधि है कि उपयोगकर्ताओं को एक अस्थायी मेज और शामिल हो:

DECLARE @t TABLE(col1 VARCHAR(1), col2 VARCHAR(1), col3 VARCHAR(1)) 

INSERT INTO @t VALUES('A', 'B', 'C'); 
INSERT INTO @t VALUES('D', 'E', 'F'); 
INSERT INTO @t VALUES('A', 'J', 'K'); 
INSERT INTO @t VALUES('G', 'H', 'H'); 

SELECT * FROM @t 

DROP TABLE #temp_table 
SELECT col1 INTO #temp_table 
    FROM @t AS t GROUP BY col1 HAVING COUNT(col1) = 1 

SELECT t.col1, t.col2 FROM @t AS t 
    INNER JOIN #temp_table AS tt ON t.col1 = tt.col1 

इसके अलावा

यहाँ एक उप क्वेरी का उपयोग कर एक उदाहरण है रिटर्न:

D E 
G H 
+0

मुझे यकीन नहीं है कि जब आपने इसका उत्तर दिया था तो मूल प्रश्न कैसा दिखता था, लेकिन अब क्या दिया गया है, यह लक्ष्य को याद करता है और लक्ष्य को मानचित्र बनाना बेहद मुश्किल है।मुझे संदेह है कि ऐसा इसलिए है क्योंकि अब हमारे पास काम करने के लिए कम जानकारी थी। –

+1

हां, प्रश्नकर्ता ने प्रश्न बदल दिया और एक अलग डेटा सेट का इस्तेमाल किया। ऊपर दिए गए उत्तरों दिए गए डेटासेट के साथ पूर्ण थे। मैंने इसे प्रतिबिंबित करने के लिए उत्तर अपडेट किया है और नए डेटासेट का उपयोग करके समाधान जोड़ा है। – vfilby

7

MySQL के लिए:

SELECT contract, activity 
FROM table 
GROUP BY contract 
HAVING COUNT(DISTINCT activity) = 1 
+0

यह भी काम नहीं करता है, आप ग्रुप BY या कुल में नहीं चुनिंदा सूची में कॉलम नहीं रख सकते हैं। आपको एक ही सिद्धांत का उपयोग करना होगा लेकिन उप-क्वेरी में या शामिल होना होगा। – vfilby

+0

असल में मैंने MySQL में अपना कोड परीक्षण किया और यह – mrm

+0

* काम करता है (पहले उदाहरण डेटा के साथ) – mrm

2

संशोधित!

SELECT distinct contract, activity from @t a 
WHERE (SELECT COUNT(DISTINCT activity) FROM @t b WHERE b.contract = a.contract) = 1 

और यहाँ एक और एक है - छोटी/बिना सबक्वेरी

select contract, max(activity) from @t 
group by contract 
having count(distinct activity) = 1 
+0

जब आईबीएम इनफॉर्मिक्स डायनामिक सर्वर 11.50 में परीक्षण किया गया, तो यह कोई डेटा नहीं उत्पन्न करता है। समस्या यह है कि अनुबंध 2000 में एक ही गतिविधि कोड के साथ दो प्रोजेक्ट पंक्तियां हैं, इसलिए COUNT (*) 2 लौटा रहा है, न कि 1. –

+0

@ जोनाथन: प्रश्न माइक्रोसॉफ्ट एसक्यूएल सर्वर के बारे में है, इसलिए एसक्यूएल का इनफॉर्मिक्स 'कार्यान्वयन पूरी तरह से अप्रासंगिक है यहाँ। –

+0

यह सच है कि आईडीएस सीधे प्रासंगिक नहीं है, लेकिन यह एक वैध SQL कार्यान्वयन है और एसक्यूएल रन से ऊपर है लेकिन सही उत्तर नहीं देता है। –

2

क्लीनर इस प्रयास करें: मान लिया जाये कि डेटा की अपनी मेज ProjectInfo कहा जाता है

select 
     contract, 
     max (activity) 
from 
     mytable 
group by 
     contract 
having 
     count (activity) = 1 
+0

जब आईबीएम इनफॉर्मिक्स डायनेमिक सर्वर 11.50 में परीक्षण किया जाता है, तो यह आवश्यक नहीं है, 2000,49 के साथ पंक्ति के साथ कोई डेटा नहीं उत्पन्न करता है। समस्या यह है कि अनुबंध 2000 में एक ही गतिविधि कोड के साथ दो प्रोजेक्ट पंक्तियां हैं, इसलिए गिनती (गतिविधि) = 2 और आवश्यकतानुसार 1 नहीं। –

+0

यह SQL सर्वर 2005 पर काम नहीं करता है। यहां समस्या यह है कि 2000,49 के लिए दो पंक्तियां हैं। आपको केवल विशिष्ट गतिविधियों की गणना करने की आवश्यकता है। – vfilby

+0

इन टिप्पणियों के प्रकाश में, जेट्सन की प्रतिक्रिया देखें। –

1

:

SELECT DISTINCT Contract, Activity 
    FROM ProjectInfo 
    WHERE Contract = (SELECT Contract 
          FROM (SELECT DISTINCT Contract, Activity 
            FROM ProjectInfo) AS ContractActivities 
          GROUP BY Contract 
          HAVING COUNT(*) = 1); 

अंतर्निहित क्वेरी वें पहचानती है ई अनुबंध और गतिविधियों। प्रश्न का अगला स्तर (मध्य एक) उन अनुबंधों की पहचान करता है जहां केवल एक गतिविधि है। बाहरीतम क्वेरी तब एक ही गतिविधि वाले अनुबंधों के लिए ProjectInfo तालिका से अनुबंध और गतिविधि खींचती है।

आईबीएम इनफॉर्मिक्स डायनामिक सर्वर 11.50 का उपयोग करके परीक्षण किया गया - कहीं और काम करना चाहिए।

1

यहाँ का उपयोग कर एक और विकल्प है एसक्यूएल सर्वर अलग गिनती:

DECLARE @T TABLE([contract] INT, project INT, activity INT) 
INSERT INTO @T VALUES(1000, 8000, 10) 
INSERT INTO @T VALUES(1000, 8000, 20) 
INSERT INTO @T VALUES(1000, 8001, 10) 
INSERT INTO @T VALUES(2000, 9000, 49) 
INSERT INTO @T VALUES(2000, 9001, 49) 
INSERT INTO @T VALUES(3000, 9000, 79) 
INSERT INTO @T VALUES(3000, 9000, 78) 



SELECT DISTINCT [contract], activity FROM @T AS A WHERE 
    (SELECT COUNT(DISTINCT activity) 
    FROM @T AS B WHERE B.[contract] = A.[contract]) = 1 
1
SELECT DISTINCT Contract, Activity 
FROM Contract WHERE Contract IN (
SELECT Contract 
FROM Contract 
GROUP BY Contract 
HAVING COUNT(DISTINCT Activity) = 1) 
+0

एमएस एसक्यूएल 2005 का उपयोग करके परीक्षण किया गया – Hapkido

2

एसक्यूएल सर्वर में "गतिशील तालिका" क्षमता का उपयोग (एक कोष्ठक-घिरा क्वेरी के खिलाफ क्वेरी करने), तो आपको वापस कर सकते हैं 2000, 49 डब्ल्यू/निम्नलिखित। यदि आपका प्लेटफ़ॉर्म "डायनामिक टेबल" एएनएसआई-एक्सटेन्शन के समतुल्य ऑफ़र नहीं देता है, तो आप परिणामों को "गतिशील तालिका" में एक अस्थायी तालिका में डालने के द्वारा दो चरणों/कथन में हमेशा एक temp तालिका का उपयोग कर सकते हैं, और उसके बाद अस्थायी तालिका पर बाद में चयन करना।

DECLARE @T TABLE(
    [contract] INT, 
    project INT, 
    activity INT 
) 

INSERT INTO @T VALUES(1000, 8000, 10) 
INSERT INTO @T VALUES(1000, 8000, 20) 
INSERT INTO @T VALUES(1000, 8001, 10) 
INSERT INTO @T VALUES(2000, 9000, 49) 
INSERT INTO @T VALUES(2000, 9001, 49) 
INSERT INTO @T VALUES(3000, 9000, 79) 
INSERT INTO @T VALUES(3000, 9000, 78) 

SELECT 
    [contract], 
    [Activity] = max (activity) 
FROM 
    (
    SELECT 
     [contract], 
     [Activity] 
    FROM 
     @T 
    GROUP BY 
     [contract], 
     [Activity] 
    ) t 
GROUP BY 
    [contract] 
HAVING count (*) = 1 
1

खेद है कि आपको PostgreSQL उपयोग नहीं कर रहे ...

अनुबंध पर DISTINCT का चयन करें, गतिविधि * से thetable आदेश अनुबंध द्वारा, गतिविधि

http://www.postgresql.org/docs/8.3/static/sql-select.html#SQL-DISTINCT

ओह प्रतीक्षा करें। आप केवल ठीक एक साथ मूल्यों चाहते हैं ...

चयन अनुबंध, गतिविधि, गणना () thetable ग्रुप से अनुबंध द्वारा, गतिविधि होने गिनती () = 1

3

मैं नहीं के एक प्रशंसक मौजूद है

SELECT DISTINCT contract, activity FROM table t1 
WHERE NOT EXISTS (
    SELECT * FROM table t2 
    WHERE t2.contract = t1.contract AND t2.activity != t1.activity 
) 
0

क्षमा करें पुराने पोस्ट मुझे पता है, लेकिन मैं एक ही मुद्दा था, ऊपर मेरे लिए काम करने के लिए के किसी भी नहीं मिल सकता है, हालांकि मैं यह पता लगा।

यह मेरे लिए काम किया:।।

का चयन करें DISTINCT [स्तंभ] UniqueValues ​​रूप से [db] [dbo] [तालिका]

0

द्वारा Col1 होने COUNT DISTINCT Col1, Col2 टेबल ग्रुप से चयन (DISTINCT Col1) = 1

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