2013-11-22 3 views
0

Это мой столНебольшие изменения в SQL Query

CREATE TABLE [dbo].[marks_581](
[Name] [varchar](30) NOT NULL, 
[Subject] [varchar](30) NOT NULL, 
[Marks] [int] NOT NULL 
) 
INSERT INTO marks_581 
select 'Dishant','English',40 union all 
select 'Dishant','Maths',45 union all 
select 'Dishant','Hindi',49 union all 
select 'Pranay','English',41 union all 
select 'Pranay','Maths',45 union all 
select 'Pranay','Hindi',50 union all 
select 'Gautham','English',41 union all 
select 'Gautham','Maths',45 union all 
select 'Gautham','Hindi',49 

select * from marks_581 

And my output should be like the below one 

Name |Subject1|Marks1|Subject2|marks2|Subject3|marks3 
Dishant|English |40 |Maths |45 |hindi |49 
Gautham|English |40 |Maths |45 |hindi |49 
Pranay |English |40 |Maths |45 |hindi |49 

Это мой запрос, и я не в состоянии получить имя субъекта в колонке субъектов. Он говорит, что не мог преобразовать varchar в тип данных int. Кто-нибудь мне помогает?

SELECT Name,  
    SUM(CASE WHEN Subject= 'English' THEN Subject ELSE 0 END) AS Subject1, 
    SUM(CASE WHEN Subject= 'English' THEN Marks ELSE 0 END) AS Marks1,   
    SUM(CASE WHEN Subject= 'Maths' THEN Subject ELSE 0 END) AS Subject2, 
    SUM(CASE WHEN Subject= 'Maths' THEN Marks ELSE 0 END) AS Marks2,  
    SUM(CASE WHEN Subject= 'Hindi' THEN Subject ELSE 0 END) AS Subject3, 
    SUM(CASE WHEN Subject= 'Hindi' THEN Marks ELSE 0 END) AS Marks3 
FROM marks_581 
GROUP BY Name 
ORDER BY Name 
+0

Вы не можете 'SUM' название темы .. это не логично, и это не сработает. – OGHaza

ответ

2

Используйте другую агрегатную функцию, например, MAX(), для нечисловых данных:

SELECT Name,  
    MAX(CASE WHEN Subject= 'English' THEN Subject END) AS Subject1, 
    SUM(CASE WHEN Subject= 'English' THEN Marks ELSE 0 END) AS Marks1,   
    MAX(CASE WHEN Subject= 'Maths' THEN Subject END) AS Subject2, 
    SUM(CASE WHEN Subject= 'Maths' THEN Marks ELSE 0 END) AS Marks2,  
    MAX(CASE WHEN Subject= 'Hindi' THEN Subject END) AS Subject3, 
    SUM(CASE WHEN Subject= 'Hindi' THEN Marks ELSE 0 END) AS Marks3 
FROM marks_581 
GROUP BY Name 
ORDER BY Name 

Хотя, учитывая характер этого запроса, мы знаем, что мы можем упростить его дальше:

SELECT Name,  
    'English' AS Subject1, 
    SUM(CASE WHEN Subject= 'English' THEN Marks ELSE 0 END) AS Marks1,   
    'Maths' AS Subject2, 
    SUM(CASE WHEN Subject= 'Maths' THEN Marks ELSE 0 END) AS Marks2,  
    'Hindi' AS Subject3, 
    SUM(CASE WHEN Subject= 'Hindi' THEN Marks ELSE 0 END) AS Marks3 
FROM marks_581 
GROUP BY Name 
ORDER BY Name 
0

это из-за ...

THEN Subject ELSE 0 END 

... предмет VARCHAR не Int

+0

Если я удалю, что он говорит о некорректном синтаксисе рядом с ')' –

0

Эй, что я чувствую, ошибка здесь

CREATE TABLE [dbo].[marks_581](
[Name] [varchar](30) NOT NULL, 
[Subject] [varchar](30) NOT NULL, 
[Marks] [int] NOT NULL 
) 

Стол созданные с использованием вышеприведенных команд, не будут иметь sub1 sub2 sub3 и mark1 mark2 и mark3

+0

Он никогда 'SELECT' 'mark1',' mark2' и 'mark3'. Он только «SELECT' 'Mark' и' Subject', которые существуют, тогда он называет столбцы «Mark1» и т. Д. – OGHaza

1
SELECT Name,  
    MAX(CASE WHEN Subject= 'English' THEN Subject ELSE Subject END) AS Subject1, 
    SUM(CASE WHEN Subject= 'English' THEN Marks ELSE 0 END) AS Marks1,   
    MAX(CASE WHEN Subject= 'Maths' THEN Subject ELSE Subject END) AS Subject2, 
    SUM(CASE WHEN Subject= 'Maths' THEN Marks ELSE 0 END) AS Marks2,  
    MAX(CASE WHEN Subject= 'Hindi' THEN Subject ELSE Subject END) AS Subject3, 
    SUM(CASE WHEN Subject= 'Hindi' THEN Marks ELSE 0 END) AS Marks3 
FROM marks_581 
GROUP BY Name 
ORDER BY Name 
+0

Вам все равно понадобится агрегат, что он делает, когда ему приходится группировать '' Maths ',' 'и' ''в 1 столбец. – OGHaza

0
SELECT Name,  
'English' AS Subject1, 
SUM(CASE WHEN Subject= 'English' THEN Marks ELSE 0 END) AS Marks1,   
'Maths' AS Subject2, 
SUM(CASE WHEN Subject= 'Maths' THEN Marks ELSE 0 END) AS Marks2,  
'Hindi' AS Subject3, 
SUM(CASE WHEN Subject= 'Hindi' THEN Marks ELSE 0 END) AS Marks3 
FROM marks_581 
GROUP BY Name 
ORDER BY Name 
Смежные вопросы