Insert blank row between groups of rows and sorted by ID in sql

前端 未结 2 1972
一个人的身影
一个人的身影 2020-12-21 05:54

I have a table which has the following columns and values

ID       TYPE     NAME
1      MAJOR      RAM
2      MAJOR      SHYAM
3      MAJOR      BHOLE
4              


        
相关标签:
2条回答
  • 2020-12-21 06:16

    Yes, yes, don't do this, but here's the query to do it, assuming SQL Server 2008 R2. Other versions/rdbms you can achieve same functionality by writing two separate queries unioned together.

    Query

    ; WITH DEMO (id, [type], [name]) AS
    (
    SELECT 1,'MAJOR','RAM'
    UNION ALL SELECT 2,'MAJOR','SHYAM'
    UNION ALL SELECT 3,'MAJOR','BHOLE'
    UNION ALL SELECT 4,'MAJOR','NATHA'
    UNION ALL SELECT 5,'MINOR','JOHN'
    UNION ALL SELECT 6,'MINOR','SMITH'   
    )
    , GROUPED AS
    (
        SELECT
            D.[type]
        ,   D.[name]
        ,   ROW_NUMBER() OVER (ORDER BY D.[type] ASC, D.[name] DESC) AS order_key
        FROM
            DEMO D
        GROUP BY
        --grouping sets introduced with SQL Server 2008 R2
        -- http://msdn.microsoft.com/en-us/library/bb510427.aspx
        GROUPING SETS
        (
            [type]
        ,   ([type], [name])
        )
    )
    SELECT
        CASE WHEN G.[name] IS NULL THEN NULL ELSE G.[type] END AS [type]
    ,   G.[name]
    FROM 
        GROUPED G
    ORDER BY
        G.order_key
    

    Results

    If you don't like the nulls, use coalsece to make empty strings

    type    name
    MAJOR   SHYAM
    MAJOR   RAM
    MAJOR   NATHA
    MAJOR   BHOLE
    NULL    NULL
    MINOR   SMITH
    MINOR   JOHN
    NULL    NULL
    
    0 讨论(0)
  • 2020-12-21 06:17

    I agree with billinkc. In a sequential mind, like mine, it can occur different. The approach is to use a cursor and insert the records into a temp table. This table can have a column, INT type, lets say it is called "POSITION" which increments with every insert. Check for ID changes, and add the empty row everytime it does. Finally make the SELECT order by "POSITION".

    My context was: An interface that dinamically adjust to what the user needs, one of the screens shows a payment table, grouped by provider with the approach early mentioned. I decided to manage this from database and skip maintainance for the screen at client side because every provider has different payment terms.

    Hope this helps, and lets keep an open mind, avoid saying "don't do this" or "this is not what SQL was designed for"

    0 讨论(0)
提交回复
热议问题