2012-11-21 5 views
8

मेरे पास SQL ​​Server 2008 R2 डेटाबेस है। इस डेटाबेस में दो टेबल हैं जिन्हें पिक्चर्स एंड पिक्चर यूसे कहा जाता है।किसी अन्य तालिका से डेटा का उपयोग कर गणनाित कॉलम बनाएं

Id (int) 
PictureName (nvarchar(max)) 
CreateDate (datetime) 

PictureUse टेबल है निम्न स्तंभ:

Id (int) 
Pictureid (int) 
CreateDate (datetime) 

मैं Picture तालिका जो मुझे कि कितनी बार कहता है में एक गणना स्तंभ बनाने की जरूरत

चित्र तालिका निम्न स्तंभ है इस तस्वीर को क्लिक किया गया है। बहुत मदद?

उत्तर

21

आपको लगता है कि के लिए एक उपयोगकर्ता परिभाषित समारोह बना सकते हैं:

CREATE FUNCTION dbo.CountUses(@pictureId INT) 
RETURNS INT 
AS 
    BEGIN 
     RETURN 
     (SELECT Count(id) 
     FROM PictureUse 
     WHERE PictureId = @PictureId) 
    END 

गणना स्तंभ तो इस तरह जोड़ा जा सकता है:

ALTER TABLE dbo.Picture 
ADD NofUses AS dbo.CountUses(Id) 

हालांकि, मैं नहीं बल्कि इस बात के लिए एक दृश्य बनाना होगा:

CREATE VIEW PictureView 
AS 
    SELECT Picture.Id, 
     PictureName, 
     Picture.CreateDate, 
     Count(PictureUse.Id) NofUses 
    FROM Picture 
     JOIN PictureUse 
      ON Picture.Id = PictureUse.PictureId 
    GROUP BY Picture.Id, 
      PictureName, 
      Picture.CreateDate 
+0

मैं अपने जवाब दे रही है लेकिन इसकी त्रुटि की कोशिश की जब मैं 'function' और' गणना बनाने रहा column' – Smartboy

+0

मैं एक स्तंभ पहले या एक समारोह बनाना चाहिए ? – Smartboy

+1

@ स्मारबॉय 'निर्माण समारोह डीबीओ। गणनाएं (INT @pictureId)' को 'फंक्शन डीबीओ बनाना चाहिए। काउंटर्यूसेस (@ चित्रचित्र आईडी INT) '। इसके अलावा फ़ंक्शन में 'BEGIN .. END' और' रिटर्न ' –

-2

इस

कोशिश
select count(distict pictureid) from pictureuse 
inner join picture on picture.id=pictureuse.pictureid 
7

एक गणना कॉलम केवल उसी तालिका में अन्य कॉलम का संदर्भ दे सकता है। आप कर सकते हैं (जेरोहेन के answer के अनुसार) एक यूडीएफ का उपयोग करें, लेकिन कॉलम को संग्रहीत नहीं किया जाएगा या अनुक्रमित नहीं किया जाएगा और इसलिए जब भी पंक्ति का उपयोग किया जाता है तो इसे फिर से संपीड़ित किया जाना चाहिए।

आप एक अनुक्रमित दृश्य है कि इस में जानकारी शामिल है (अगर, के रूप में मुझे लगता है, यह सिर्फ PictureUse से पंक्तियों की गिनती है) बना सकते हैं:

CREATE VIEW dbo.PictureStats 
WITH SCHEMABINDING 
AS 
    SELECT PictureID,COUNT_BIG(*) as Cnt from dbo.PictureUse 
GO 
CREATE UNIQUE CLUSTERED INDEX IC_PictureStats on dbo.PictureStats (PictureID) 

परदे के पीछे, एसक्यूएल सर्वर प्रभावी रूप से एक का निर्माण करेगा तालिका जिसमें इस दृश्य के परिणाम शामिल हैं, और PictureUse पर प्रत्येक सम्मिलित, अद्यतन या हटाएं, यह परिणाम तालिका स्वचालित रूप से आपके लिए बनाए रखेगी।

+0

+1 जब यह पढ़ने की बात आती है तो यह यूडीएफ की तुलना में काफी बेहतर होता है, बड़ी चेतावनी यह है कि यह गिनती पंक्ति पर ताला के कारण लिखता है। –

0

आपको अपनी तालिका में गणना कॉलम जोड़ने की ज़रूरत नहीं है, क्योंकि, इसके बाद अपडेट किया गया है, यदि मूल तालिका डेटा बदल गया है, तो डेटा असंगत हो जाता है, आप कॉलम गिनती पाने के लिए हमेशा इस चयन कथन का उपयोग कर सकते हैं या बना सकते हैं यह एक दृश्य के रूप में

select p.id,count(*) as count 
from Picture P 
join PictureUse U 
on p.id=u.Pictureid 
group by p.id 
0

यह काम करेंगे

SELECT P.id 
     ,P.PictureName 
     ,COUNT(P.id) as [Count] 
     FROM Picture P 
     INNER JOIN PictureUse PU 
     ON P.id=PU.Pictureid 
     GROUP BY P.id,P.PictureName 
संबंधित मुद्दे