2012-10-19 15 views
6

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

select client_id, 
    [1],[2],[3],[4],[5],[6],[7] -- these are timestested (the amount of times tested) 
    from 
    ( SELECT DISTINCT CLIENT_ID 
    , PATIENT_ID 
    , count(*) over (partition by client_id, patient_id) AS patientcount 

    from f_accession_daily) as SourceTable 
    PIVOT 
    (
    count(patient_id) 
    for patientcount in ([1],[2],[3],[4],[5],[6],[7]) 
    ) as pivottable 

मैं परीक्षण किया हर बार के लिए अधिकतम/मिनट दिनांकों लाने की जरूरत है, (के लिए:

+-----------+----+----+---+---+---+---+---+ 
| client_id | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 
+-----------+----+----+---+---+---+---+---+ 
| 216436 | 9 | 0 | 0 | 0 | 0 | 0 | 0 | 
| 110522 | 76 | 3 | 0 | 0 | 0 | 0 | 0 | 
| 214981 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 
| 216360 | 52 | 1 | 0 | 0 | 0 | 0 | 0 | 
| 102574 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 
| 211754 | 97 | 14 | 2 | 0 | 0 | 0 | 0 | 
| 210734 | 8 | 4 | 0 | 0 | 0 | 0 | 0 | 
| 10| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 
| 101840 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 
+-----------+----+----+---+---+---+---+---+ 

क्वेरी यहां है [1], [2], [3], आदि) इस तालिका से:

+-----------+-------------+-------+------------+------------+ 
| client_id | TimesTested | count | maxRecDate | minRecDate | 
+-----------+-------------+-------+------------+------------+ 
| 100034 |   2 |  1 | 6/25/2008 | 6/23/2008 | 
| 100034 |   1 | 20 | 6/30/2008 | 6/19/2008 | 
| 100038 |   3 |  1 | 7/25/2008 | 7/23/2008 | 
| 100038 |   1 |  4 | 7/25/2008 | 7/1/2008 | 
| 100050 |   1 | 15 | 8/11/2008 | 7/14/2008 | 
| 100060 |   1 |  2 | 8/12/2008 | 7/29/2008 | 
| 100070 |   1 |  3 | 8/15/2008 | 8/15/2008 | 
| 100049 |   1 |  3 | 8/22/2008 | 7/11/2008 | 
| 100029 |   3 |  2 | 8/25/2008 | 6/18/2008 | 
+-----------+-------------+-------+------------+------------+ 

उपरोक्त तालिका उत्पन्न होता है द्वारा:

SELECT a.client_id AS client_id 
,a.patientcount TimesTested 
    , count(a.patientcount)/a.patientcount AS count 
    , max(f.received_date) AS maxRecDate 
    , min(f.received_date) AS minRecDate 
FROM 
(
    SELECT DISTINCT CLIENT_ID 
    , PATIENT_ID 
    , count(*) over (partition by client_id, patient_id) AS patientcount 

    from f_accession_daily 

) AS a 
JOIN F_ACCESSION_DAILY AS f ON a.CLIENT_ID = f.CLIENT_ID 
    AND a.PATIENT_ID = f.PATIENT_ID 

GROUP BY a.CLIENT_ID, a.patientcount 

जिसके परिणामस्वरूप तालिका है कि मैं प्राप्त करने की आवश्यकता:

+-----------+----+----------+-----------+----+----------+-----------+---+----------+-----------+---+----------+-----------+-----+ 
| client_id | 1 | maxdate1 | mindate1 | 2 | maxdate2 | mindate2 | 3 | maxdate3 | mindate3 | 4 | maxdate4 | mindate4 | 5 | 
+-----------+----+----------+-----------+----+----------+-----------+---+----------+-----------+---+----------+-----------+-----+ 
| 216436 | 9 | 1/1/2011 | 1/23/1985 | 0 | 1/1/2011 | 1/23/1985 | 0 | 1/1/2011 | 1/23/1985 | 0 | 1/1/2011 | 1/23/1985 | etc | 
| 110522 | 76 | 1/1/2011 | 1/23/1984 | 3 | 1/1/2011 | 1/23/1984 | 0 | 1/1/2011 | 1/23/1984 | 0 | 2/1/2011 | 1/23/1984 |  | 
| 214981 | 0 | 1/1/2013 | 1/23/1985 | 1 | 1/1/2013 | 1/23/1985 | 0 | 1/1/2013 | 1/23/1985 | 0 | 1/1/2013 | 1/23/1985 |  | 
| 216360 | 52 | 1/1/2011 | 1/23/1985 | 1 | 1/1/2011 | 1/23/1985 | 0 | 1/1/2011 | 1/23/1985 | 0 | 1/1/2011 | 1/23/1985 |  | 
| 102574 | 1 | 1/1/2011 | 1/23/1985 | 0 | 1/1/2014 | 1/23/1980 | 0 | 2/1/2011 | 1/23/1985 | 0 | 1/1/2011 | 1/23/1985 |  | 
| 211754 | 97 | 1/1/2012 | 1/23/1985 | 14 | 1/1/2012 | 1/23/1985 | 2 | 1/1/2012 | 1/23/1985 | 0 | 1/1/2012 | 1/23/1985 |  | 
| 210734 | 8 | 1/1/2011 | 1/23/1984 | 4 | 1/1/2011 | 1/23/1984 | 0 | 1/1/2011 | 1/23/1984 | 0 | 1/1/2011 | 1/23/1984 |  | 
| 10| 1 | 1/1/2011 | 1/23/1985 | 0 | 1/1/2011 | 1/23/1985 | 0 | 1/1/2011 | 1/23/1985 | 0 | 1/1/2011 | 1/23/1987 |  | 
| 101840 | 2 | 1/1/2011 | 1/23/1985 | 0 | 1/1/2011 | 1/23/1980 | 0 | 1/1/2011 | 1/23/1985 | 0 | 1/1/2011 | 1/23/1985 |  | 
+-----------+----+----------+-----------+----+----------+-----------+---+----------+-----------+---+----------+-----------+-----+ 

कैसे मैं दो तालिकाओं शामिल होते हैं? गति कोई फर्क नहीं पड़ता! आपकी तरह की मदद के लिए बहुत बहुत धन्यवाद।

+0

तो लग रहा है यह दोनों client_id पर और शामिल होने के लिए है की तरह 1, 2, 3, 4 .. (जो है TimesTested) –

+0

हाँ thats सही – user1760020

+0

जहां @JNK जब आप उसे जरूरत है? –

उत्तर

1

नहीं सुंदर, लेकिन मैं अपने मूल प्रश्नों ऐसे ही छोड़ दिया और यह सब एक [बड़ा] बयान में डाल दिया:

;WITH 
PivotQuery as (
    select client_id, 
     [1],[2],[3],[4],[5],[6],[7] 
     from 
     ( SELECT DISTINCT CLIENT_ID 
     , PATIENT_ID 
     , count(*) over (partition by client_id, patient_id) AS patientcount 

     from f_accession_daily) as SourceTable 
     PIVOT 
     (
     count(patient_id) 
     for patientcount in ([1],[2],[3],[4],[5],[6],[7]) 
     ) as pivottable), 

MinMaxTimes as (
    SELECT a.client_id AS client_id 
    ,a.patientcount TimesTested 
     , count(a.patientcount)/a.patientcount AS count 
     , max(f.received_date) AS maxRecDate 
     , min(f.received_date) AS minRecDate 
    FROM 
    (
     SELECT DISTINCT CLIENT_ID 
     , PATIENT_ID 
     , count(*) over (partition by client_id, patient_id) AS patientcount 

     from f_accession_daily 

    ) AS a 
    JOIN F_ACCESSION_DAILY AS f ON a.CLIENT_ID = f.CLIENT_ID 
     AND a.PATIENT_ID = f.PATIENT_ID 

    GROUP BY a.CLIENT_ID, a.patientcount), 

maxDates as (
SELECT client_id, [1] maxdate1, [2] maxdate2, [3] maxdate3, [4] maxdate4, [5] maxdate5, [6] maxdate6, [7] maxdate7 
FROM MinMaxTimes t 
PIVOT (max(maxRecDate) 
for TimesTested IN ([1], [2], [3], [4], [5], [6], [7]) 
) as p), 

minDates as (
SELECT client_id, [1] mindate1, [2] mindate2, [3] mindate3, [4] mindate4, [5] mindate5, [6] mindate6, [7] mindate7 
FROM MinMaxTimes t 
PIVOT (max(minRecDate) 
for TimesTested IN ([1], [2], [3], [4], [5], [6], [7]) 
) as p) 

SELECT p.client_id, 
    p.[1], max(maxdate1) maxdate1, max(mindate1) mindate1, 
    p.[2], max(maxdate2) maxdate2, max(mindate2) mindate2, 
    p.[3], max(maxdate3) maxdate3, max(mindate3) mindate3, 
    p.[4], max(maxdate4) maxdate4, max(mindate4) mindate4, 
    p.[5], max(maxdate5) maxdate5, max(mindate5) mindate5, 
    p.[6], max(maxdate6) maxdate6, max(mindate6) mindate6, 
    p.[7], max(maxdate7) maxdate7, max(mindate7) mindate7 
FROM PivotQuery p 
LEFT OUTER JOIN maxDates a ON p.client_id = a.client_id 
LEFT OUTER JOIN mindates i ON a.client_id = i.client_id 
GROUP BY p.client_id, p.[1], p.[2], p.[3], p.[4], p.[5], p.[6], p.[7] 
+0

वाह! यह प्रिये अद्भुत लग रहा है !! क्या आप कुछ स्थितियों में फेंकना नहीं चाहते हैं जहां maxdate1 शून्य नहीं है और दिमाग 1 शून्य नहीं है और अधिकतम दिनांक 2 शून्य नहीं है ... और आंतरिक जुड़ने के बजाय बाएं शामिल हों? –

+0

शायद गलत है, मुझे नहीं पता :) –

+0

हाँ, एक बाएं जुड़ाव उनको ढंकना चाहिए, मैं इसे जोड़ दूंगा। – d89761

1

दो प्रश्नों में शामिल होने की कोई जरूरत नहीं है। इसके अलावा, स्वयं में शामिल होने का कोई उपयोग करने की आवश्यकता नहीं है। (counted) client_id और patient_id द्वारा समूहों डेटा और पंक्ति की गणना करता है

  1. पहले CTE: यहां आप एक क्वेरी में सभी आवश्यक डेटा का चयन के बारे में कैसे जा सकते हैं है:

    WITH counted AS (
        SELECT 
        client_id, 
        COUNT(*) AS TimesTested, 
        MAX(received_date) AS maxdate, 
        MIN(received_date) AS mindate 
        FROM f_accession_daily 
        GROUP BY 
        client_id, 
        patient_id 
    ), 
    counted2 AS (
        SELECT 
        client_id, 
        TimesTested, 
        CAST(COUNT(*) AS varchar(30)) AS count, 
        CAST(MAX(maxdate) AS varchar(30)) AS maxdate, 
        CAST(MIN(mindate) AS varchar(30)) AS mindate 
        FROM counted 
        GROUP BY 
        client_id, 
        TimesTested 
    ), 
    unpivoted AS (
        SELECT 
        client_id, 
        ColumnName + CAST(TimesTested AS varchar(10)) AS ColumnName, 
        ColumnValue 
        FROM counted2 
        UNPIVOT (
        ColumnValue FOR ColumnName IN (count, maxdate, mindate) 
    ) u 
    ), 
    pivoted AS (
        SELECT 
        client_id, 
        count1, maxdate1, mindate1, 
        count2, maxdate2, mindate2, 
        count3, maxdate3, mindate3, 
        count4, maxdate4, mindate4, 
        count5, maxdate5, mindate5, 
        count6, maxdate6, mindate6, 
        count7, maxdate7, mindate7 
        FROM unpivoted 
        PIVOT (
        MAX(ColumnValue) FOR ColumnName IN (
         count1, maxdate1, mindate1, 
         count2, maxdate2, mindate2, 
         count3, maxdate3, mindate3, 
         count4, maxdate4, mindate4, 
         count5, maxdate5, mindate5, 
         count6, maxdate6, mindate6, 
         count7, maxdate7, mindate7 
        ) 
    ) p 
    ) 
    SELECT * 
    FROM pivoted 
    ; 
    

    यह इस तरह होता है गिनती, अधिकतम तिथि और प्रत्येक समूह के लिए न्यूनतम तिथि।

  2. दूसरा CTE (counted2) समूहों पिछले परिणाम client_id और पंक्ति संख्या (TimesTested कहा जाता है) वाले कॉलम द्वारा निर्धारित और फिर से गिना जाता है पंक्तियों और अधिकतम और समूह प्रति मिनट दिनांकों पाता है। उत्पादित पंक्ति आपके प्रश्न में दूसरी तालिका के समान है, count को छोड़कर COUNT(*) है (क्योंकि यह आपकी पहली क्वेरी की गणना करता है)। इसके अतिरिक्त, सभी समेकित परिणाम स्ट्रिपिंग में परिवर्तित हो जाते हैं, ताकि उन्हें बिना छेड़छाड़ के लिए तैयार किया जा सके।

    client_id ColumnName ColumnValue 
    --------- ---------- ----------- 
    211754  count1  97 
    211754  maxdate1 1/1/2012 
    211754  mindate1 1/23/1985 
    211754  count1  14 
    211754  maxdate1 1/1/2012 
    211754  mindate1 1/23/1985 
    ... 
    
  3. अंतिम CTE, pivoted,, अंतिम चरण के प्रदर्शन पिछले के परिणाम की पिवट:

  4. निम्नलिखित CTE, unpivoted, उपर्युक्त unpivoting, इस तरह की एक rowset उत्पादन करता है सीटीई, आखिरकार आप जिस आउटपुट को चाहते हैं उसका उत्पादन करते हैं।

+0

बिल्कुल अविश्वसनीय प्रदर्शन। आप एक प्रतिभाशाली हैं। –

+0

@ АртёмЦарионов: धन्यवाद, आप बहुत दयालु हैं। –

+0

क्या आप इस बात से निश्चित हैं कि इसे गिनती (*) में गिनती 2 में होना चाहिए? क्या आपको टेस्टफ्रीक्वेंसी का औसत और औसत प्राप्त नहीं करना चाहिए? –

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