我有表[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];
但
中的关键字不正常答案 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)
答案 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