如何基于onther列在同一个表列中进行数据透视查询

时间:2017-11-01 12:38:23

标签: sql sql-server sql-server-2012

我有表[Application]。[ApplicationDetails],其中我有3列

      ID   |  [QuestionId]   |   [Answer]
       1   |   106           |   YES I HAVE
       2   |   106           |   ONLY SIMAB HAVE
       3   |   107           |   ORANGES WERE SOUR
       4   |   107           |   GRAPES SOUR
       5   |   108           |   ALEIN CENTER 
       6   |   106           |   no one

我想要一个透视查询来显示我的问题ID的答案数据,如

     QuestionId
Answers

示例

  106              108 
  YES I HAVE       ALEIN CENTER
  ONLY SIMAB HAVE

然后继续我正在尝试的东西

      WITH cte AS (
           SELECT [QuestionId] as [Quest],
             [Answer] as [Answer] 

      FROM  [Application].[ApplicationDetails]

      )

                SELECT [Answer] ,[Quest]
                FROM
                (
                SELECT [Quest]  , [Answer]

                FROM cte
                          ) d
                pivot
                (
                [Answer]  in [Quest]
      ) piv
        ORDER BY [Quest];

中的关键字不正常

4 个答案:

答案 0 :(得分:0)

这应该会给你想要的结果。

SELECT [106], [107]
FROM (
    SELECT QuestionId, Answer, ROW_NUMBER() OVER (PARTITION BY QuestionId ORDER BY Answer) r
    FROM [dbo].[ApplicationDetails]
) t
PIVOT(MAX(Answer) FOR QuestionId IN ([106], [107])) AS p

已编辑(动态SQL)

DECLARE @QuestionIds VARCHAR(MAX), @Query VARCHAR(MAX);

WITH DistinctResults AS (
    SELECT DISTINCT '[' + CAST(QuestionId AS VARCHAR) + ']' QuestionId FROM [ApplicationDetails]
)
SELECT @QuestionIds = (SELECT QuestionId + ', ' AS 'data()'  FROM DistinctResults FOR XML PATH(''));


SELECT @QuestionIds = STUFF(@QuestionIds, LEN(@QuestionIds), 1, '')

SELECT @Query = 
N'SELECT ' + @QuestionIds + '
FROM (
    SELECT QuestionId, Answer, ROW_NUMBER() OVER (PARTITION BY QuestionId ORDER BY Answer) r
    FROM [dbo].[ApplicationDetails]
) t
PIVOT(MAX(Answer) FOR QuestionId IN (' + @QuestionIds + ')) AS p';

EXEC (@Query)

答案 1 :(得分:0)

这里将为您提供所需的结果,但是如果您的选择中有ID,则您的questionid与文本不匹配时将显示空值。

DECLARE @myt TABLE (
 ID int, QuestionID int, Answer nvarchar(50)
  )

  insert into @myt
  values 

   (1,   106,'YES I HAVE'),
   (2,   106,'ONLY SIMAB HAVE'),
   (3,   107,'ORANGES WERE SOUR'),
   (4,   107,'GRAPES SOUR'),
   (5,   108,'ALEIN CENTER'),
   (6,   106,'no one')



   select [106],[107],[108]
   from @myt
   PIVOT 
   (Max(Answer) FOR QUESTIONID in ([106],[107],[108])
   ) as p;

如果你想在具有新ID的相同行上

DECLARE @myt TABLE (
 ID int, QuestionID int, Answer nvarchar(50)
 )

   insert into @myt
 values 

   (1,   106,'YES I HAVE'),
   (2,   106,'ONLY SIMAB HAVE'),
   (3,   107,'ORANGES WERE SOUR'),
   (4,   107,'GRAPES SOUR'),
   (5,   108,'ALEIN CENTER'),
   (6,   106,'no one')



  select * from (
   select QuestionID,Answer,ROW_NUMBER() over(PARTITION by QuestionID order by answer) as rn
   from @myt
   )x
   PIVOT 
   (Max(Answer) FOR QuestionID in ([106],[107],[108])
   ) as p

使用DYNAMIC SQL编辑更新

/*CREATE TABLE*/


CREATE TABLE Dbo.TESTQUESTION (
ID int, QuestionID int, Answer nvarchar(50)
 )

 insert into dbo.TESTQUESTION
 values 

(1,   106,'YES I HAVE'),
(2,   106,'ONLY SIMAB HAVE'),
(3,   107,'ORANGES WERE SOUR'),
(4,   107,'GRAPES SOUR'),
(5,   108,'ALEIN CENTER'),
(6,   106,'no one')




  declare @gruppe nvarchar(max)
  declare @gruppeSql nvarchar(max)
  declare @SQL nvarchar(max)
  DECLARE myCustomers CURSOR FOR
  select distinct   QuestionID from dbo.TESTQUESTION 
  set @gruppeSql = ''
  OPEN myCustomers
   FETCH NEXT FROM myCustomers INTO @gruppe
  IF (@@FETCH_STATUS>=0)
  BEGIN
  SET @gruppeSql = @gruppeSql +'[' +@gruppe+']'
  FETCH NEXT FROM myCustomers INTO @gruppe
   END
   WHILE (@@FETCH_STATUS<>-1)
   BEGIN
   IF (@@FETCH_STATUS<>-2)

   SET @gruppeSql = @gruppeSql  + ',[' +@gruppe+']'
   FETCH NEXT FROM myCustomers INTO @gruppe
   END
   CLOSE myCustomers
   DEALLOCATE myCustomers 

  SET @gruppeSql = replace(@gruppesql,'''','')
  select @gruppeSql
   SET @SQL = '
    select * from (
   select QuestionID,Answer,ROW_NUMBER() over(PARTITION by QuestionID order 
 by answer) as rn
   from dbo.TESTQUESTION
   )x
   PIVOT 
   (Max(Answer) FOR QuestionID in ('+@gruppesql+') 
   ) as p'


  exec(@sql)

动态查询和自制ID的结果 enter image description here

答案 2 :(得分:0)

这是简短的DECLARE @Str NVARCHAR(MAX); DECLARE @Str2 NVARCHAR(MAX); SELECT @Str = STUFF( ( SELECT DISTINCT ','+QUOTENAME(QuestionID) FROM <table_name> FOR XML PATH('') ), 1, 1, ''); -- PRINT @Str SET @str2 = N'select * from ( select QuestionID,Answer,ROW_NUMBER() over(PARTITION by QuestionID order by answer) as rn from <table_name> )x PIVOT (Max(Answer) FOR QuestionID in ('+@Str+') ) as p'; --PRINT @Str2; EXEC (@Str2); 方式:

rn  106             107                 108
1   YES I HAVE      GRAPES SOUR         ALEIN CENTER    
2   no one          ORANGES WERE SOUR   NULL
3   ONLY SIMAB HAVE NULL                NULL

结果:

@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {

    private static myDb dbh = null;
    private static Context context = null;
    private static Integer n = 100;

    @BeforeClass
    public static void setUp() throws Exception {
        context = InstrumentationRegistry.getTargetContext();
        dbh = myDb.getDatabase(context);
    }

    @Before
    public void clear() throws Exception {
        dbh.daoCurrency().clearCurrencies();
        dbh.daoCurrencyPair().clearCurrencyPairs();
    }



    public void createCurrencies() {
        Integer n=100;

        for (Integer i=1; i<=n; i++)
        {
            Currency c = new Currency();
            c.setCode("CUR"+i);

            dbh.daoCurrency().addCurrencies(c);
        }

    }

    public void createCurrencyPairs() {

        List<Currency> currencyList = dbh.daoCurrency().getCurrencies();

        for (Currency c1 : currencyList)
        {
            for (Currency c2 : currencyList)
            {
                CurrencyPair cp = new CurrencyPair();
                cp.setBaseId(c1.getId());
                cp.setCounterId(c2.getId());

                dbh.daoCurrencyPair().addCurrencyPairs(cp);
            }

        }

    }

    @Test
    public void testCurrencies() {

        createCurrencies();

        List<Currency> currencyList = dbh.daoCurrency().getCurrencies();
        assertEquals((Integer) n, (Integer) currencyList.size());
    }

    @Test
    public void testCurrencyPairs() {

        createCurrencies();
        createCurrencyPairs();

        List<CurrencyPair> currencypairList = dbh.daoCurrencyPair().getCurrencyPairs();
        assertEquals((Integer) (n*n), (Integer) currencypairList.size());
    }

    @AfterClass
    public static void tearDown() throws Exception {
        dbh.close();
    }
}

答案 3 :(得分:0)

只需添加您需要的问题,您将获得基于questionId&#39的结果

示例数据创建

IF OBJECT_ID('tempdb..#t') IS NOT NULL
DROP TABLE #t;

IF OBJECT_ID('tempdb..#Result') IS NOT NULL
DROP TABLE #Result;

GO

;With cte(ID,[QuestionId],[Answer])
AS
(
SELECT 1,106,'YES I HAVE'       UNION ALL
SELECT 2,106,'ONLY SIMAB HAVE'  UNION ALL
SELECT 3,107,'ORANGES WERE SOUR'UNION ALL
SELECT 4,107,'GRAPES SOUR'      UNION ALL
SELECT 5,108,'ALEIN CENTER'     UNION ALL
SELECT 6,106,'no one'
)
SELECT *  INTO #t FROM cte

在下面的变量中添加所需的QuestionId

DECLARE @QuestinID VARCHAR(100)='106,107,108'-- Add Required QuestionId's

DECLARE @GetQuestion TABLE (QuestionID VARCHAR(100))
    INSERT INTO @GetQuestion
    SELECT @QuestinID


    SELECT * INTO #Result 
    FROM #t WHERE QuestionID IN(SELECT CAST(Split.a.value('.','nvarchar(1000)') AS INT) AS QuestionID  FROM
    (
    SELECT 
    CAST('<S>'+REPLACE(QuestionID,',','</S><S>')+'</S>' AS XML ) AS QuestionID 
    FROM @GetQuestion 
    )AS A
    CROSS APPLY QuestionID.nodes('S') AS Split(a))
    ORDER BY QuestionID


    DECLARE @Sql nvarchar(max),@DyColm nvarchar(max)

    SELECT @DyColm=STUFF((SELECT DISTINCT ', '+ QUOTENAME(CAST(QuestionID AS VARCHAR(10))) FROM #Result FOR XML PATH ('')),1,2,'')



    SET @Sql='
    SELECT '+@DyColm+' FROm
    (
    SELECT * FRom #Result
    )AS Src
     PIVOT
     (
     MAX([Answer]) FOR QuestionID IN ('+@DyColm+')
     )AS Pvt
     '

     PRINT @Sql
     EXEC(@Sql)
     SET NOCOUNT OFF