简体   繁体   中英

How to select data based Group by ID,Year,Month in sqlserver?

How to get the data based on the given below format:

Id    name      year      month     amount 
1       A        2012      jan       100
1       A        2012      jan       900 
1       A        2012      jan       300
1       A        2012      apr       100
1       A        2012      apr       500 
2       B        2013      may       100 

Output would be in the below mentioned form, if name, year, and month in parameter,

Id     name   Jan    feb  mar  Apr  may  jun ...... jan .....may total
1       A      1300   0   0    600   0    0   .....  0 ...... 0 1900
2       B      0      0   0     0    0    0.........0.......100 100 

You need to use PIVOT to get result like you mentioned Here is one example to use PIVOT

and your sql syntex like

    SELECT * FROM (SELECT t.id,t.name,t.month,t.amount,(SELECT SUM(t2.amount) FROM dbo.test AS t2 GROUP BY t2.name HAVING t2.name= t.name ) AS total FROM dbo.test AS t) as s
PIVOT
(
    SUM(Amount)
    FOR [month] IN (jan, feb, mar, apr, 
    may, jun, jul, aug, sep, oct, nov, dec) 
)AS pivots 

Example

declare @t table (Id INT,name VARCHAR(10),years VARCHAR(10),months  VARCHAR(10),amt INT  )
insert into  @t (Id,name,years,months,amt)values (1,'A','2012','jan',100)
insert into  @t (Id,name,years,months,amt)values (2,'A','2012','jan',100)
insert into  @t (Id,name,years,months,amt)values (3,'A','2012','apr',200)
insert into  @t (Id,name,years,months,amt)values (4,'A','2012','apr',100)
insert into  @t (Id,name,years,months,amt)values (5,'B','2013','may',200)

Select id,
    name,
    ISNULL(jan,0) As Jan,
    ISNULL(feb,0) As FEb,
    ISNULL(mar,0) As Mar,
    ISNULL(apr,0)As Apr,ISNULL(JUn,0)As Jun,ISNULL(jul,0)As jul,ISNULL(aug,0)As aug
         from
(Select distinct t.ID,t.name,t.years,t.months As Months,t.amt

        from @t t)t
PIVOT (SUM(amt)FOR Months IN( [jan],
    [feb],
    [mar],
    [apr],[JUn],[jul],[aug]))p

I think this might need a dynamic pivot?

CREATE TABLE #Data (
    Id INT,
    name VARCHAR(1),
    [year] INT,
    [month] VARCHAR(3),
    amount INT);
INSERT INTO #Data VALUES (1, 'A', 2012, 'jan', 100);
INSERT INTO #Data VALUES (1, 'A', 2012, 'jan', 900);
INSERT INTO #Data VALUES (1, 'A', 2012, 'jan', 300);
INSERT INTO #Data VALUES (1, 'A', 2012, 'apr', 100);
INSERT INTO #Data VALUES (1, 'A', 2012, 'apr', 500);
INSERT INTO #Data VALUES (2, 'B', 2013, 'may', 100);
DECLARE @cols VARCHAR(1024);
SELECT 
    @Cols = STUFF((
    SELECT DISTINCT 
        ',' + QUOTENAME(CONVERT(VARCHAR(4), [year]) + '/' + [month]) 
    FROM 
        #Data
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1 ,1 ,'');
DECLARE @Query VARCHAR(MAX);
SELECT @Query = '
WITH Aggregated AS (
    SELECT
        Id,
        name,
        CONVERT(VARCHAR(4), [year]) + ''/'' + [month] AS YearMonth,
        SUM(amount) AS amount
    FROM
        #Data
    GROUP BY
        Id,
        name,
        [year],
        [month])
SELECT
    *   
FROM
    Aggregated
PIVOT (
    SUM(amount)
    FOR YearMonth IN (' + @cols + ')
) p;';
EXEC (@Query);

Results look like this:

Id  name    2012/apr    2012/jan    2013/may
1   A       600         1300        NULL
2   B       NULL        NULL        100

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM