none
Выборка по разным условиям RRS feed

  • Вопрос

  • Подскажите, пожалуйста, можно ли при создании вьюхи задавать разные условия выборки для разных столбцов?

    (к примеру имеется 2 таблицы, "Предмет" с перечнем всех предметов и "Оценки_студента", хранящие оценки студентов по различным предметам. Таблицы связанны напрямую через поле "Код_предмета".   Необходимо подсчитать, сколько студентов имеют оценку "2", сколько "3" и т.д. Результаты вывести в отдельную таблицу с полями Предмет, Кол-во двоишников, Кол-во троишников и т.д.)

    27 июля 2010 г. 6:21

Ответы

  • --Podgotawliwaet dannie
    CREATE TABLE #Predmet (PredmetID tinyint identity(1,1), PredmetName varchar(56))
    INSERT INTO #Predmet(PredmetName)
    VALUES('Matematika'),('Physika')
    GO
    
    CREATE TABLE #OcenkaStudenta (OcenkaStudentaID int identity(1,1),
    	 PredmetID tinyint, StudentID int, Ocenka tinyint)
    INSERT INTO #OcenkaStudenta(PredmetID,StudentID,Ocenka)
    VALUES(1,1,5),(1,1,5),(1,1,4),
    (1,2,3),(1,3,4),(1,4,5),(1,5,3),
    (2,1,5),(2,1,4),(2,2,2),(2,3,4),
    (2,4,4),(2,6,2)
    GO
    
    ;WITH t1 AS
    (
    	SELECT os.StudentID,p.PredmetName, os.Ocenka
    	FROM #Predmet p LEFT JOIN #OcenkaStudenta os
    	ON p.PredmetID = os.PredmetID
    )
    SELECT PredmetName,[1],[2],[3],[4],[5]
    FROM (SELECT * FROM t1) AS SourceTable
    PIVOT(
    COUNT(StudentID) FOR Ocenka IN ([1],[2],[3],[4],[5]) ) AS PivotTable GO --udalaet wremennie tablizy DROP TABLE #Predmet GO DROP TABLE #OcenkaStudenta GO

    Gruß Yury
    • Предложено в качестве ответа Yury Iwtschenko 29 июля 2010 г. 17:29
    • Помечено в качестве ответа Daniil KhabarovModerator 4 августа 2010 г. 11:38
    29 июля 2010 г. 17:29
  • через CASE можно



    select PredmetName
       , sum (case when Ocenka = 1 then 1 else 0 end) as [1]
       , sum (case when Ocenka = 2 then 1 else 0 end) as [2]
       , sum (case when Ocenka = 3 then 1 else 0 end) as [3]
       , sum (case when Ocenka = 4 then 1 else 0 end) as [4]
       , sum (case when Ocenka = 5 then 1 else 0 end) as [5]          
     from #Predmet p LEFT JOIN #OcenkaStudenta os
    	on p.PredmetID = os.PredmetID
    	group by PredmetName
    

    http://www.t-sql.ru
    2 августа 2010 г. 6:48
    Отвечающий

Все ответы

  • Читайте про оператор PIVOT.
    27 июля 2010 г. 10:09
  • через CASE можно


    http://www.t-sql.ru
    27 июля 2010 г. 13:47
    Отвечающий
  • Уважаемый Alex Kuznetsov,

    посмотрите вот тут и тут. Вроде даже с примерами разобрано. Как продвигается решение проблемы?



    Daniil Khabarov, MSFT  Follow MSTechnetForum on Twitter
    Мнения, высказанные здесь, являются отражением моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий
    Посетите Блог Инженеров
    28 июля 2010 г. 10:02
    Модератор
  • --Podgotawliwaet dannie
    CREATE TABLE #Predmet (PredmetID tinyint identity(1,1), PredmetName varchar(56))
    INSERT INTO #Predmet(PredmetName)
    VALUES('Matematika'),('Physika')
    GO
    
    CREATE TABLE #OcenkaStudenta (OcenkaStudentaID int identity(1,1),
    	 PredmetID tinyint, StudentID int, Ocenka tinyint)
    INSERT INTO #OcenkaStudenta(PredmetID,StudentID,Ocenka)
    VALUES(1,1,5),(1,1,5),(1,1,4),
    (1,2,3),(1,3,4),(1,4,5),(1,5,3),
    (2,1,5),(2,1,4),(2,2,2),(2,3,4),
    (2,4,4),(2,6,2)
    GO
    
    ;WITH t1 AS
    (
    	SELECT os.StudentID,p.PredmetName, os.Ocenka
    	FROM #Predmet p LEFT JOIN #OcenkaStudenta os
    	ON p.PredmetID = os.PredmetID
    )
    SELECT PredmetName,[1],[2],[3],[4],[5]
    FROM (SELECT * FROM t1) AS SourceTable
    PIVOT(
    COUNT(StudentID) FOR Ocenka IN ([1],[2],[3],[4],[5]) ) AS PivotTable GO --udalaet wremennie tablizy DROP TABLE #Predmet GO DROP TABLE #OcenkaStudenta GO

    Gruß Yury
    • Предложено в качестве ответа Yury Iwtschenko 29 июля 2010 г. 17:29
    • Помечено в качестве ответа Daniil KhabarovModerator 4 августа 2010 г. 11:38
    29 июля 2010 г. 17:29
  • через CASE можно



    select PredmetName
       , sum (case when Ocenka = 1 then 1 else 0 end) as [1]
       , sum (case when Ocenka = 2 then 1 else 0 end) as [2]
       , sum (case when Ocenka = 3 then 1 else 0 end) as [3]
       , sum (case when Ocenka = 4 then 1 else 0 end) as [4]
       , sum (case when Ocenka = 5 then 1 else 0 end) as [5]          
     from #Predmet p LEFT JOIN #OcenkaStudenta os
    	on p.PredmetID = os.PredmetID
    	group by PredmetName
    

    http://www.t-sql.ru
    2 августа 2010 г. 6:48
    Отвечающий