SQL PIVOT table with MIN() and on Multiple columns










0















Here is the table structure



ID TypeX TypeXDesc XDate TypeCodeY
040001 3669 Unspecified Cat 2005-08-08 1
040001 3669 Unspecified Cat 2006-08-29 2
040001 37515 Tear Film 2005-08-08 1
040001 37999 Disor 2004-07-22 1


Transform above table INTO below USING PIVOT



ID TypeX_1 TypeXDesc_1 XDate_1 TypeCodeY_1 TypeX_2 TypeXDesc_2 XDate_2 TypeCodeY_2 TypeX_3 TypeXDesc_3 XDate_3 TypeCodeY_3
040001 3669 Unspecified Cat 2005-08-08 1 37515 Tear Film 2005-08-08 1 37999 Disor 2004-07-22 1


Look at the same TypeX code but XDate is different and we need to get Min(XDate) so first row is qualified not the second row.










share|improve this question






















  • Any comments please, minor clue would get me going..

    – user1810575
    Nov 15 '18 at 18:28











  • Quit trying to use the PIVOT operator and use aggregated case expressions.

    – Jason A. Long
    Nov 15 '18 at 18:30











  • I started off with aggregated case expressions but its long time to run the query and some one suggested me to use PIVOT. Also there are 20 columns TypeX_1,2,3...20, it was getting expensive using aggregated case exp

    – user1810575
    Nov 15 '18 at 18:41











  • The PIVOT syntax isn't going to be any better. In fact the aggregated CASE will normally out perform the PIVOT.

    – Jason A. Long
    Nov 15 '18 at 18:45















0















Here is the table structure



ID TypeX TypeXDesc XDate TypeCodeY
040001 3669 Unspecified Cat 2005-08-08 1
040001 3669 Unspecified Cat 2006-08-29 2
040001 37515 Tear Film 2005-08-08 1
040001 37999 Disor 2004-07-22 1


Transform above table INTO below USING PIVOT



ID TypeX_1 TypeXDesc_1 XDate_1 TypeCodeY_1 TypeX_2 TypeXDesc_2 XDate_2 TypeCodeY_2 TypeX_3 TypeXDesc_3 XDate_3 TypeCodeY_3
040001 3669 Unspecified Cat 2005-08-08 1 37515 Tear Film 2005-08-08 1 37999 Disor 2004-07-22 1


Look at the same TypeX code but XDate is different and we need to get Min(XDate) so first row is qualified not the second row.










share|improve this question






















  • Any comments please, minor clue would get me going..

    – user1810575
    Nov 15 '18 at 18:28











  • Quit trying to use the PIVOT operator and use aggregated case expressions.

    – Jason A. Long
    Nov 15 '18 at 18:30











  • I started off with aggregated case expressions but its long time to run the query and some one suggested me to use PIVOT. Also there are 20 columns TypeX_1,2,3...20, it was getting expensive using aggregated case exp

    – user1810575
    Nov 15 '18 at 18:41











  • The PIVOT syntax isn't going to be any better. In fact the aggregated CASE will normally out perform the PIVOT.

    – Jason A. Long
    Nov 15 '18 at 18:45













0












0








0








Here is the table structure



ID TypeX TypeXDesc XDate TypeCodeY
040001 3669 Unspecified Cat 2005-08-08 1
040001 3669 Unspecified Cat 2006-08-29 2
040001 37515 Tear Film 2005-08-08 1
040001 37999 Disor 2004-07-22 1


Transform above table INTO below USING PIVOT



ID TypeX_1 TypeXDesc_1 XDate_1 TypeCodeY_1 TypeX_2 TypeXDesc_2 XDate_2 TypeCodeY_2 TypeX_3 TypeXDesc_3 XDate_3 TypeCodeY_3
040001 3669 Unspecified Cat 2005-08-08 1 37515 Tear Film 2005-08-08 1 37999 Disor 2004-07-22 1


Look at the same TypeX code but XDate is different and we need to get Min(XDate) so first row is qualified not the second row.










share|improve this question














Here is the table structure



ID TypeX TypeXDesc XDate TypeCodeY
040001 3669 Unspecified Cat 2005-08-08 1
040001 3669 Unspecified Cat 2006-08-29 2
040001 37515 Tear Film 2005-08-08 1
040001 37999 Disor 2004-07-22 1


Transform above table INTO below USING PIVOT



ID TypeX_1 TypeXDesc_1 XDate_1 TypeCodeY_1 TypeX_2 TypeXDesc_2 XDate_2 TypeCodeY_2 TypeX_3 TypeXDesc_3 XDate_3 TypeCodeY_3
040001 3669 Unspecified Cat 2005-08-08 1 37515 Tear Film 2005-08-08 1 37999 Disor 2004-07-22 1


Look at the same TypeX code but XDate is different and we need to get Min(XDate) so first row is qualified not the second row.







sql sql-server sql-server-2008-r2






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 15 '18 at 17:17









user1810575user1810575

30511638




30511638












  • Any comments please, minor clue would get me going..

    – user1810575
    Nov 15 '18 at 18:28











  • Quit trying to use the PIVOT operator and use aggregated case expressions.

    – Jason A. Long
    Nov 15 '18 at 18:30











  • I started off with aggregated case expressions but its long time to run the query and some one suggested me to use PIVOT. Also there are 20 columns TypeX_1,2,3...20, it was getting expensive using aggregated case exp

    – user1810575
    Nov 15 '18 at 18:41











  • The PIVOT syntax isn't going to be any better. In fact the aggregated CASE will normally out perform the PIVOT.

    – Jason A. Long
    Nov 15 '18 at 18:45

















  • Any comments please, minor clue would get me going..

    – user1810575
    Nov 15 '18 at 18:28











  • Quit trying to use the PIVOT operator and use aggregated case expressions.

    – Jason A. Long
    Nov 15 '18 at 18:30











  • I started off with aggregated case expressions but its long time to run the query and some one suggested me to use PIVOT. Also there are 20 columns TypeX_1,2,3...20, it was getting expensive using aggregated case exp

    – user1810575
    Nov 15 '18 at 18:41











  • The PIVOT syntax isn't going to be any better. In fact the aggregated CASE will normally out perform the PIVOT.

    – Jason A. Long
    Nov 15 '18 at 18:45
















Any comments please, minor clue would get me going..

– user1810575
Nov 15 '18 at 18:28





Any comments please, minor clue would get me going..

– user1810575
Nov 15 '18 at 18:28













Quit trying to use the PIVOT operator and use aggregated case expressions.

– Jason A. Long
Nov 15 '18 at 18:30





Quit trying to use the PIVOT operator and use aggregated case expressions.

– Jason A. Long
Nov 15 '18 at 18:30













I started off with aggregated case expressions but its long time to run the query and some one suggested me to use PIVOT. Also there are 20 columns TypeX_1,2,3...20, it was getting expensive using aggregated case exp

– user1810575
Nov 15 '18 at 18:41





I started off with aggregated case expressions but its long time to run the query and some one suggested me to use PIVOT. Also there are 20 columns TypeX_1,2,3...20, it was getting expensive using aggregated case exp

– user1810575
Nov 15 '18 at 18:41













The PIVOT syntax isn't going to be any better. In fact the aggregated CASE will normally out perform the PIVOT.

– Jason A. Long
Nov 15 '18 at 18:45





The PIVOT syntax isn't going to be any better. In fact the aggregated CASE will normally out perform the PIVOT.

– Jason A. Long
Nov 15 '18 at 18:45












1 Answer
1






active

oldest

votes


















0














You can accomplish this using conditional aggregation. In this case, you can enumerate the rows with within typex/id groups using row_number(). You can enumerate the groups with with typex/id using dense_rank().



Then, use conditional aggregation:



select t.id,
max(case when grpnum = 1 and seqnum = 1 then typex end) as typex_1,
max(case when grpnum = 1 and seqnum = 1 then TypeXDesc end) as TypeXDesc_1,
max(case when grpnum = 1 and seqnum = 1 then XDate end) as XDate_1,
max(case when grpnum = 1 and seqnum = 1 then TypeCodeY end) as TypeCodeY_1,
max(case when grpnum = 2 and seqnum = 1 then typex end) as typex_12,
max(case when grpnum = 2 and seqnum = 1 then TypeXDesc end) as TypeXDesc_2,
max(case when grpnum = 2 and seqnum = 1 then XDate end) as XDate_2,
max(case when grpnum = 2 and seqnum = 1 then TypeCodeY end) as TypeCodeY_3,
max(case when grpnum = 3 and seqnum = 1 then typex end) as typex_1,
max(case when grpnum = 3 and seqnum = 1 then TypeXDesc end) as TypeXDesc_3,
max(case when grpnum = 3 and seqnum = 1 then XDate end) as XDate_3,
max(case when grpnum = 3 and seqnum = 1 then TypeCodeY end) as TypeCodeY_3
from (select t.*,
row_number() over (partition by id, typex order by xdate as seqnum,
dense_rank() over (partition by id order by typex) as grpnum
from t
) t
group by id;





share|improve this answer






















    Your Answer






    StackExchange.ifUsing("editor", function ()
    StackExchange.using("externalEditor", function ()
    StackExchange.using("snippets", function ()
    StackExchange.snippets.init();
    );
    );
    , "code-snippets");

    StackExchange.ready(function()
    var channelOptions =
    tags: "".split(" "),
    id: "1"
    ;
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function()
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled)
    StackExchange.using("snippets", function()
    createEditor();
    );

    else
    createEditor();

    );

    function createEditor()
    StackExchange.prepareEditor(
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader:
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    ,
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    );



    );













    draft saved

    draft discarded


















    StackExchange.ready(
    function ()
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53324758%2fsql-pivot-table-with-min-and-on-multiple-columns%23new-answer', 'question_page');

    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    0














    You can accomplish this using conditional aggregation. In this case, you can enumerate the rows with within typex/id groups using row_number(). You can enumerate the groups with with typex/id using dense_rank().



    Then, use conditional aggregation:



    select t.id,
    max(case when grpnum = 1 and seqnum = 1 then typex end) as typex_1,
    max(case when grpnum = 1 and seqnum = 1 then TypeXDesc end) as TypeXDesc_1,
    max(case when grpnum = 1 and seqnum = 1 then XDate end) as XDate_1,
    max(case when grpnum = 1 and seqnum = 1 then TypeCodeY end) as TypeCodeY_1,
    max(case when grpnum = 2 and seqnum = 1 then typex end) as typex_12,
    max(case when grpnum = 2 and seqnum = 1 then TypeXDesc end) as TypeXDesc_2,
    max(case when grpnum = 2 and seqnum = 1 then XDate end) as XDate_2,
    max(case when grpnum = 2 and seqnum = 1 then TypeCodeY end) as TypeCodeY_3,
    max(case when grpnum = 3 and seqnum = 1 then typex end) as typex_1,
    max(case when grpnum = 3 and seqnum = 1 then TypeXDesc end) as TypeXDesc_3,
    max(case when grpnum = 3 and seqnum = 1 then XDate end) as XDate_3,
    max(case when grpnum = 3 and seqnum = 1 then TypeCodeY end) as TypeCodeY_3
    from (select t.*,
    row_number() over (partition by id, typex order by xdate as seqnum,
    dense_rank() over (partition by id order by typex) as grpnum
    from t
    ) t
    group by id;





    share|improve this answer



























      0














      You can accomplish this using conditional aggregation. In this case, you can enumerate the rows with within typex/id groups using row_number(). You can enumerate the groups with with typex/id using dense_rank().



      Then, use conditional aggregation:



      select t.id,
      max(case when grpnum = 1 and seqnum = 1 then typex end) as typex_1,
      max(case when grpnum = 1 and seqnum = 1 then TypeXDesc end) as TypeXDesc_1,
      max(case when grpnum = 1 and seqnum = 1 then XDate end) as XDate_1,
      max(case when grpnum = 1 and seqnum = 1 then TypeCodeY end) as TypeCodeY_1,
      max(case when grpnum = 2 and seqnum = 1 then typex end) as typex_12,
      max(case when grpnum = 2 and seqnum = 1 then TypeXDesc end) as TypeXDesc_2,
      max(case when grpnum = 2 and seqnum = 1 then XDate end) as XDate_2,
      max(case when grpnum = 2 and seqnum = 1 then TypeCodeY end) as TypeCodeY_3,
      max(case when grpnum = 3 and seqnum = 1 then typex end) as typex_1,
      max(case when grpnum = 3 and seqnum = 1 then TypeXDesc end) as TypeXDesc_3,
      max(case when grpnum = 3 and seqnum = 1 then XDate end) as XDate_3,
      max(case when grpnum = 3 and seqnum = 1 then TypeCodeY end) as TypeCodeY_3
      from (select t.*,
      row_number() over (partition by id, typex order by xdate as seqnum,
      dense_rank() over (partition by id order by typex) as grpnum
      from t
      ) t
      group by id;





      share|improve this answer

























        0












        0








        0







        You can accomplish this using conditional aggregation. In this case, you can enumerate the rows with within typex/id groups using row_number(). You can enumerate the groups with with typex/id using dense_rank().



        Then, use conditional aggregation:



        select t.id,
        max(case when grpnum = 1 and seqnum = 1 then typex end) as typex_1,
        max(case when grpnum = 1 and seqnum = 1 then TypeXDesc end) as TypeXDesc_1,
        max(case when grpnum = 1 and seqnum = 1 then XDate end) as XDate_1,
        max(case when grpnum = 1 and seqnum = 1 then TypeCodeY end) as TypeCodeY_1,
        max(case when grpnum = 2 and seqnum = 1 then typex end) as typex_12,
        max(case when grpnum = 2 and seqnum = 1 then TypeXDesc end) as TypeXDesc_2,
        max(case when grpnum = 2 and seqnum = 1 then XDate end) as XDate_2,
        max(case when grpnum = 2 and seqnum = 1 then TypeCodeY end) as TypeCodeY_3,
        max(case when grpnum = 3 and seqnum = 1 then typex end) as typex_1,
        max(case when grpnum = 3 and seqnum = 1 then TypeXDesc end) as TypeXDesc_3,
        max(case when grpnum = 3 and seqnum = 1 then XDate end) as XDate_3,
        max(case when grpnum = 3 and seqnum = 1 then TypeCodeY end) as TypeCodeY_3
        from (select t.*,
        row_number() over (partition by id, typex order by xdate as seqnum,
        dense_rank() over (partition by id order by typex) as grpnum
        from t
        ) t
        group by id;





        share|improve this answer













        You can accomplish this using conditional aggregation. In this case, you can enumerate the rows with within typex/id groups using row_number(). You can enumerate the groups with with typex/id using dense_rank().



        Then, use conditional aggregation:



        select t.id,
        max(case when grpnum = 1 and seqnum = 1 then typex end) as typex_1,
        max(case when grpnum = 1 and seqnum = 1 then TypeXDesc end) as TypeXDesc_1,
        max(case when grpnum = 1 and seqnum = 1 then XDate end) as XDate_1,
        max(case when grpnum = 1 and seqnum = 1 then TypeCodeY end) as TypeCodeY_1,
        max(case when grpnum = 2 and seqnum = 1 then typex end) as typex_12,
        max(case when grpnum = 2 and seqnum = 1 then TypeXDesc end) as TypeXDesc_2,
        max(case when grpnum = 2 and seqnum = 1 then XDate end) as XDate_2,
        max(case when grpnum = 2 and seqnum = 1 then TypeCodeY end) as TypeCodeY_3,
        max(case when grpnum = 3 and seqnum = 1 then typex end) as typex_1,
        max(case when grpnum = 3 and seqnum = 1 then TypeXDesc end) as TypeXDesc_3,
        max(case when grpnum = 3 and seqnum = 1 then XDate end) as XDate_3,
        max(case when grpnum = 3 and seqnum = 1 then TypeCodeY end) as TypeCodeY_3
        from (select t.*,
        row_number() over (partition by id, typex order by xdate as seqnum,
        dense_rank() over (partition by id order by typex) as grpnum
        from t
        ) t
        group by id;






        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 15 '18 at 20:19









        Gordon LinoffGordon Linoff

        790k35314418




        790k35314418





























            draft saved

            draft discarded
















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid


            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.

            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53324758%2fsql-pivot-table-with-min-and-on-multiple-columns%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            這個網誌中的熱門文章

            How to read a connectionString WITH PROVIDER in .NET Core?

            Node.js Script on GitHub Pages or Amazon S3

            Museum of Modern and Contemporary Art of Trento and Rovereto