2017-01-26 8 views
0

У меня проблемы данных видели моей публичной демо-сайт:T-SQL с ORDER BY различия в хранимой процедуре выявления GROUP BY вопросов

http://cbmiweb.com/GmapsV3/opedemo3.aspx

По умолчанию ORDER появляется ОК, но меняющегося в Order By Total#Awards разоблачений проблема ясно, но я застрял на том, как это исправить.

Веб-страница предоставляет ссылку к необработанных данных возвращенных (пожары хранимую процедуру), где вы можете увидеть проблему данных:

http://cbmiweb.com/CBMI.WebAPIservice/api/markers/GetGrants/2

Короче говоря, почему @Sort = 1 «группа» Заведение = «КОЛЛЕДЖ ГОСУДАРСТВЕННОГО СООБЩЕСТВА ЕЩЕСТВА», но при использовании @Sort = 2, это лицо «чередуется» с другими учреждениями с 8 наградами?

Использование SQL Server 2008, здесь хранимая процедура, которая заказывает конечный результат установить 3 различными способами (проблема наиболее заметно при @Sort = 2), показанной выше:

ALTER PROCEDURE [dbo].[FLAS2_List_Awards_V1] 
    -- EXECUTE dbo.FLAS2_List_Awards_V1 2 
    (@Sort int = 1 -- 1 = descending order on TotalAmount 
         -- 2 = descending order on TotalAwards 
         -- 3 = ascending order on Institution 
    ) 
AS 
    CREATE TABLE #TempMarkers 
    (
     ID nchar(6) NOT NULL, 
     Institution nvarchar(255) NOT NULL, 
     Street nvarchar(255) NULL, 
     City nvarchar(255) NULL, 
     State nvarchar(255) NULL, 
     Zip nvarchar(255) NULL, 
     Latitude decimal(28, 18) NULL, 
     Longitude decimal(28, 18) NULL, 
     TotalAwards decimal(16, 0) NULL, 
     TotalAmount decimal (16, 0) NULL 
    ) 

    INSERT INTO #TempMarkers(ID, Institution, Street, City, State, Zip, 
          Latitude, Longitude, TotalAwards, TotalAmount) 
     SELECT DISTINCT 
      C.ID, C.InstitutionName, 
      NULL AS street, NULL AS city, NULL AS state, NULL AS zip, 
      NULL As Latitude, NULL As Longitude, 
      COUNT(DISTINCT o.GrantNumber) as TotalAwards, 
      SUM(DISTINCT o.TotalObligatedAmount) as TotalAmount 
     FROM 
      dbo.FLAS2_Schools2 C 
     INNER JOIN 
      dbo.FLAS2_Grants o ON c.id = o.ID 
     -- where o.ID in (100654,100724) 
     GROUP BY 
      C.ID, C.InstitutionName 
      --,Z.Lat 
      -- ,Z.Long 

    UPDATE #TempMarkers 
    SET Street = x.street, 
     City = x.city, 
     State = x.state, 
     Zip = x.zip  
    FROM 
     dbo.FLAS2_Schools2 X 
    WHERE 
     X.ID = #TempMarkers.ID 
     AND X.InstitutionName = #TempMarkers.Institution 

    UPDATE #TempMarkers 
    SET Latitude = Z.lat, 
     Longitude = Z.Long 
    FROM dbo.ZipCodesPreferred Z       
    WHERE Z.ZipCode = #TempMarkers.Zip 

    --SELECT * FROM #TempMarkers 
    IF @Sort = 1 
    BEGIN 
     SELECT DISTINCT 
      Marker.ID, Marker.Institution, 
      Marker.Street, Marker.City, Marker.State, Marker.Zip, 
      Marker.Latitude, Marker.Longitude, 
      Marker.TotalAmount, Marker.TotalAwards, 
      Award.GrantNumber as GrantNumber, 
      Award.TotalObligatedAmount as GrantAmount 
     FROM 
      #TempMarkers Marker  
     INNER JOIN 
      dbo.FLAS2_Grants Award ON Marker.ID = Award.ID 
     ORDER BY 
      Marker.TotalAmount DESC, GrantAmount DESC 
     FOR XML AUTO, ROOT('root') 
    END 

    IF @Sort = 2 
    BEGIN 
     SELECT 
      Marker.ID, Marker.Institution, 
      Marker.Street, Marker.City, Marker.State, Marker.Zip, 
      Marker.Latitude, Marker.Longitude, 
      Marker.TotalAmount, Marker.TotalAwards, 
      Award.GrantNumber as GrantNumber, 
      Award.TotalObligatedAmount as GrantAmount 
     FROM 
      #TempMarkers Marker  
     INNER JOIN 
      dbo.FLAS2_Grants Award ON Marker.ID = Award.ID 
     ORDER BY 
      Marker.TotalAmount DESC, GrantAmount DESC 
     FOR XML AUTO, ROOT('root') 
    END 

    IF @Sort = 3 
    BEGIN 
     SELECT 
      Marker.ID, Marker.Institution, 
      Marker.Street, Marker.City, Marker.State, Marker.Zip, 
      Marker.Latitude, Marker.Longitude, 
      Marker.TotalAmount, Marker.TotalAwards, 
      Award.GrantNumber as GrantNumber, 
      Award.TotalObligatedAmount as GrantAmount 
     FROM 
      #TempMarkers Marker  
     INNER JOIN 
      dbo.FLAS2_Grants Award ON Marker.ID = Award.ID 
     ORDER BY 
      Marker.Institution, GrantAmount DESC 
     FOR XML AUTO, ROOT('root') 
END 

ответ

0

Я нашел решение. Мне просто нужно было подумать об этом немного позже после перерыва ...

Предложение ORDER BY было недостаточно. Когда в столбце первичной сортировки есть что-то вроде TotalAwards, очевидно, что будут некоторые «связи» (т. Е. Несколько объектов, имеющих одинаковое количество наград). Поэтому для удаления эффекта «чередования» необходимо сортировать второй раз в столбце имен.

Правильный ORDER BY п выглядит следующим образом:

order by Marker.TotalAwards DESC, Marker.Institution, GrantAmount DESC 
+0

ли маркировать свой ответ, как правильно и, пожалуйста, изменить название, так что другие найдут это легко, когда они ищут для него – Coder

 Смежные вопросы

  • Нет связанных вопросов^_^