2009-03-20 9 views
5

मैं एक प्रश्न है कि इस तरह दिखता है:पंक्तियाँ और समूहन

SELECT OrganizationName, OrganizationID, ReceivableStatus, InvoiceFee 
FROM v_InvoicesFreelanceOutstanding 
ORDER BY OrganizationID 

कि से डेटा इस प्रकार दिखाई देंगे:

 
OrganizationName OrganizationID  ReceivableStatus  InvoiceFee 
----------------------------------------------------------------------------- 
Company A      139  60-90 days     672.00 
Company A      139  60-90 days    1800.00 
Company A      139  over 90 days    1440.00 
Company B      264  Current     3559.38 
Company B      264  60-90 days    3785.50 
Company C      271  60-90 days     446.25 
Company C      271  over 90 days    637.50 
Company C      271  over 90 days    1126.25 

मैं क्या चाहते हैं अंत में प्रदर्शन कुछ इस तरह है (उपरोक्त डेटा के लिए):

 
Company  Current 30-60 days 60-90 days over 90 days  Total 
----------------------------------------------------------------------------- 
Company A   0    0  2472.00    0  2472.00 
Company B 3559.38    0  3785.50    0  7344.88 
Company C   0    0  446.25   1763.75  2210.00 

मेरे एसक्यूएल फू मुझे इस अतीत प्राप्त करने के लिए पर्याप्त नहीं है:

012,
SELECT 
    MAX(OrganizationName) as OrganizationName, 
    OrganizationID, 
    ReceivableStatus, 
    SUM(InvoiceFee) as TotalDue 
FROM v_InvoicesFreelanceOutstanding 
GROUP BY OrganizationID, ReceivableStatus 

कौन सा कुछ इस तरह (फिर से, ऊपर डेटा से) दिखाता है:

 
OrganizationName OrganizationID  ReceivableStatus   TotalDue 
----------------------------------------------------------------------------- 
Company A      139  60-90 days    2472.00 
Company A      139  over 90 days    1440.00 
Company B      264  Current     3559.38 
Company B      264  60-90 days    3785.50 
Company C      271  60-90 days     446.25 
Company C      271  over 90 days    1763.75 

तो क्या? किसी भी सहायता की सराहना की जाएगी।

ध्यान दें कि 2 तालिका (Current, 30-60 days, 60-90 days, over 90 days) में दिखाया गया है स्थितियों केवल लोगों को मैं ReceivableStatus के तहत आने की उम्मीद कर रहा हूँ कर रहे हैं।

EDIT: इसमें शामिल न करने के लिए खेद है। मुझे PIVOT से अवगत है, लेकिन मैं इसे जो कुछ भी करना चाहता हूं उसे प्राप्त नहीं कर सका।

उत्तर

2

यदि आप SQL Server 2005 या बाद में उपयोग कर रहे हैं तो यह pivot के लिए नौकरी की तरह दिखता है।

संपादित करें:

जब से तुम पहले से ही पता के बारे में pivot, तुम्हें पता है यह आप लगभग क्या जरूरत है।

SELECT 
    MAX(OrganizationName) as OrganizationName, 
    OrganizationID, 
    ReceivableStatus, 
    SUM(InvoiceFee) as TotalDue 
FROM v_InvoicesFreelanceOutstanding 
GROUP BY OrganizationID, ReceivableStatus 

जो तुम वर्तमान देता है, 30-60, 60-90 और 90 + भागों है कि आप की जरूरत है:

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

(SELECT 
    MAX(OrganizationName) as OrganizationName, 
    OrganizationID, 
    ReceivableStatus, 
    SUM(InvoiceFee) as TotalDue 
FROM v_InvoicesFreelanceOutstanding 
GROUP BY OrganizationID, ReceivableStatus) 
UNION 
(SELECT 
    MAX(OrganizationName) as OrganizationName, 
    OrganizationID, 
    'Total' AS ReceivableStatus, 
    SUM(InvoiceFee) as TotalDue 
FROM v_InvoicesFreelanceOutstanding 
GROUP BY OrganizationID) 

धुरी और आप उत्पादन आप चाहते हैं मिलना चाहिए: तो बस कुल में फेंक

SELECT * 
FROM 
    [the query above] 
PIVOT (
    SUM(TotalDue) 
    FOR ReceivableStatus IN ([Current],[30-60 days],[60-90 days],[over 90 days],[Total]) 
) 
+0

मैं स्पष्ट किया जाना चाहिए था है, मुझे PIVOT के बारे में पता है, मैं बस इसे करने में असमर्थ था जो मुझे चाहिए। –

+0

मैं एक मूर्ख हूँ। PIVOT पर मेरा पहला जाना है जो आपके पास है लेकिन मैंने PIVOT क्लॉज में SUM (TotalDue) के बजाय SUM (InvoiceFee) किया है। Boohoo। हालांकि, यह काम करता है। धन्यवाद। –

+0

हम सभी गलतियां करते हैं। महत्वपूर्ण बात यह है कि हम उनसे सीखते हैं। मुझे खुशी है कि मैं मदद कर सकता हूं। – Welbog

0

मुझे लगता है कि अपने धुरी और unpivot कार्यक्षमता के लिए खोज रहे हैं। इस पर एक नज़र डालें: http://msdn.microsoft.com/en-us/library/ms177410.aspx

+0

मुझे स्पष्ट होना चाहिए था; मुझे PIVOT के बारे में पता है, मैं बस इसे करने में असमर्थ था जो मुझे चाहिए। –

3

PIVOT बेकार है। इसमें भयानक वाक्यविन्यास है और पिवोट टेबल अर्थ में एक पिवोट नहीं है यानी आपको पता होना चाहिए कि कितने कॉलम अग्रिम होंगे।

क्रॉस-टैब रिपोर्ट करना संभवतः संभव है।

SELECT 
OrganizationName, 
OrganizationID, 
SUM(CASE WHEN ReceivableStatus  = '30-60 days' THEN InvoiceFee ELSE 0 END) AS [30 - 60 Days], 
SUM(CASE WHEN ReceivableStatus  = '60-90 days' THEN InvoiceFee ELSE 0 END) AS [60 - 90 Days], 
SUM(CASE WHEN ReceivableStatus  = '90-120 days' THEN InvoiceFee ELSE 0 END) AS [90 - 120 Days] 

FROM 
v_InvoicesFreelanceOutstanding 
GROUP BY OrganizationID 
+0

समूह के साथ यह कैसे काम करेगा, यद्यपि? मैं केवल 30-60 दिनों के कॉलम के तहत 30-60 दिनों के एसयूएम (चालान) को दिखाना चाहता हूं, और इसी तरह। –

+0

और मुझे पता चलेगा कि कितने कॉलम अग्रिम होंगे, इसलिए यदि मैं काम पूरा कर दूंगा तो मैं PIVOT के साथ ठीक हूं, हालांकि वाक्यविन्यास मेरे सिर को चोट पहुंचा रहा है। –

1

मैंने पहले धुरी का इस्तेमाल किया है नहीं है, जिससे कि आपका जवाब हो सकता है, लेकिन मैं अतीत में इस तरह एक समस्या पर जानवर बल का उपयोग किया है और आप के लिए यह कुछ ऐसा दिखाई देगा:

SELECT OrganizationName, SUM(Current) AS Current, SUM(3060Days) AS 3060Days, SUM(6090Days) AS 6090Days, SUM(Over90Days) As Over90Days, SUM(Total) AS Total 
FROM 
(
SELECT 
    OrganizationName, 
    CASE WHEN ReceivableStatus = 'Current' THEN 
     SUM(InvoiceFee) 
    ELSE 
     0 
    END AS Current, 
    CASE WHEN ReceivableStatus = '30-60 days' THEN 
     SUM(InvoiceFee) 
    ELSE 
     0 
    END AS 3060Days, 
    CASE WHEN ReceivableStatus = '60-90 days' THEN 
     SUM(InvoiceFee) 
    ELSE 
     0 
    END AS 6090Days, 
    CASE WHEN ReceivableStatus = 'over 90 days' THEN 
     SUM(InvoiceFee) 
    ELSE 
     0 
    END AS Over90Days, 
    SUM(InvoiceFee) AS Total 
FROM v_InvoicesFreelanceOutstanding 
GROUP BY OrganizationName, ReceivableStatus) temp 
GROUP BY OrganizationName 

असल में, आंतरिक क्वेरी आपको प्रत्येक संगठन के लिए परिणाम देती है और कुल प्रत्येक श्रेणी के लिए कुल और बाहरी क्वेरी प्रत्येक संगठन के लिए एकल पंक्तियों में से सभी को एकत्र करती है। फिर, यह जाने का सबसे सुरुचिपूर्ण या कुशल तरीका नहीं हो सकता है, लेकिन यह एक तरीका है।

+0

+1। हालांकि यह काम करता है, यह अपेक्षा से बड़ा है और मुझे PIVOT काम मिल रहा है। हालांकि धन्यवाद! –

2

ठीक है, यहाँ एक और धुरी :)

 
SET NOCOUNT ON 

DECLARE @table TABLE 
( OrganizationName VARCHAR(20), 
    OrganizationID  INT, 
    ReceivableStatus VARCHAR(20), 
    InvoiceFee  FLOAT 
) 

INSERT INTO @table 
SELECT 'Company A',139,'60-90 days',672.00 UNION 
SELECT 'Company A',139,'60-90 days',1800.00 UNION 
SELECT 'Company A',139,'over 90 days',1440.00 UNION 
SELECT 'Company B',264,'Current',3559.38 UNION 
SELECT 'Company B',264,'60-90 days',3785.50 UNION 
SELECT 'Company C',271,'60-90 days',446.25 UNION 
SELECT 'Company C',271,'over 90 days',637.50 UNION 
SELECT 'Company C',271,'over 90 days',1126.25 

--Specify Just the fields you want to return 
;WITH COMPANYINFO(OrganizationName,OrganizationID,ReceivableStatus,InvoiceFee) AS 
    (
    SELECT OrganizationName, 
     OrganizationID, 
     ReceivableStatus, 
     InvoiceFee 
    FROM @Table AS b 
    ) 
    SELECT * 
    FROM COMPANYINFO 
    PIVOT 
     (
     SUM(InvoiceFee) 
     FOR ReceivableStatus 
     IN ([Current],[60-90 days],[over 90 days]) 
     ) 
    AS P 
    ORDER BY OrganizationName 
+0

अच्छी तरह से किया गया। धन्यवाद। –

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