none
רוצה לבצע שאילת PIVOT על עמודות לא ידועות כפרמטר

    שאלה

  • DECLARE @FromDate as datetime = '2018-01-01',
     @ToDate as datetime = '2018-05-31',
     @AgencyId as int = 916;
    
    DECLARE @columns NVARCHAR(MAX) = N'', @sql NVARCHAR(MAX),
     @FixedColumns NVARCHAR(MAX)
    
    SELECT @columns += N', ' + QUOTENAME(company)
      FROM (SELECT company From Policy GROUP BY company) AS x ;
      SET @FixedColumns = STUFF(REPLACE(@columns, ', [', ',['), 1, 1, '')
    PRINT @FixedColumns; -- [15],[3],[12],[6],[43],[7]
    
    SELECT * FROM (
      SELECT agent [MyAgent], company AS [MyCompany], Total FROM policy WHERE (bordero BETWEEN @FromDate AND @ToDate) AND (AgencyId = 916)) TableDate
    PIVOT (SUM(Total) FOR [MyCompany] IN ( @FixedColumns )
    ) PivotTable

    כל מה שאני רוצה זה להעניס כפרמטר את רשימת העמודות לתוך PIVOT כפרמטר.

    יום רביעי 13 יוני 2018 15:46

כל התגובות

  • ברוך הבא לפורום :-)

    שאלה נהדרת :-)
    שהיא גם שאלה מאוד נפוצה...

    אבל כרגע יש לנו 2 אפשרויות להמשיך את הדיון:

    1. אם אתה רוצה שנציג פתרון אפשרי ונדון במקרה הספציפי שלך, אז אנחנו יותר מידע על המערכת, או במילים אחרות אנחנו צריכים DDL+DML (ראה את הקישור הבא). זו כמובן האפשרות העדיפה.

    2. האפשרות השניה היא שאנחנו נכוון אותך לפתרון כללי

    מהשאלה שלך ברור שאתה צריך לעבוד עם שאילתה דינמית למשל באמצעות הפרוצדורה השמורה sp_executesql. בקישור הבא תוכל לקרוא את התיעוד הרשמי על פרוצדורה זו עם כמה דוגמאות בסיסיות.

    https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-executesql-transact-sql?view=sql-server-2017 

    המקרה עליו אתה דן הוא מקרה פרטי של שימוש בשאילתה דינמית. אתה צריך להריץ שאילתת pivot דינמית או במילה במוכרת Dynamic Pivot. הרעיון הבסיסי הוא לעבוד ב 2 שלבים: (א) אתה מוצא את העמודות שיש לך בעזרת שאילתה פשוטה על טבלת מערכת למשל. (ב) בעזרת המידע מהחלק ראשון אתה יכול להריץ לבנות את השאילתה שאתה רוצה להריץ (ז"א אתה בונה את הטקסט של השאילתה) ואז אתה מריץ את השאילתה הדינמית.

    אני מציע לך לחפש בגוגל את צירוף המילים sql server dynamic pivot tutorial. ישנם אלפי מאמרים ומדריכים מעולים בנושא, ושוב, אם אתה נתקל בבעיות לממש את הפתרון אז תצרף לנו DDL+DML כדי שנוכל לדון במקרה הספציפי שלך.


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]    [Linkedin]



    יום חמישי 14 יוני 2018 00:56
    מנחה דיון