2014-09-15 2 views
-3

Я собираю сложный запрос, чтобы создать своего рода отчет и иметь небольшую проблему. Мне нужно, чтобы в отчете показывались только учетные записи 9000-9200. Отчет должен отображать каждую учетную запись [Bill Acct], затем иметь итоговые значения для этой учетной записи за каждый час, а затем заканчивать текущую итоговую сумму за день для этой учетной записи. Мой текущий запрос ниже:SQL Query help

Select [Bill Acct], 
    (select [Total Fee] from Trans where DATEPART(hh, [Time Out]) = 0 ANd Cast([Date Out] as date) = Cast(getdate() as date)) as [0000], 
    (select [Total Fee] from Trans where DATEPART(hh, [Time Out]) = 1 ANd Cast([Date Out] as date) = Cast(getdate() as date)) as [0100], 
    (select Sum([Total Fee]) from Trans where DATEPART(hh, [Time Out]) = 2 ANd Cast([Date Out] as date) = Cast(getdate() as date)) as [0200], 
    (select Sum([Total Fee]) from Trans where DATEPART(hh, [Time Out]) = 3 ANd Cast([Date Out] as date) = Cast(getdate() as date)) as [0300], 
    (select Sum([Total Fee]) from Trans where DATEPART(hh, [Time Out]) = 4 ANd Cast([Date Out] as date) = Cast(getdate() as date)) as [0400], 
    (select Sum([Total Fee]) from Trans where DATEPART(hh, [Time Out]) = 5 ANd Cast([Date Out] as date) = Cast(getdate() as date)) as [0500], 
    (select Sum([Total Fee]) from Trans where DATEPART(hh, [Time Out]) = 6 ANd Cast([Date Out] as date) = Cast(getdate() as date)) as [0600], 
    (select Sum([Total Fee]) from Trans where DATEPART(hh, [Time Out]) = 7 ANd Cast([Date Out] as date) = Cast(getdate() as date)) as [0700], 
    (select Sum([Total Fee]) from Trans where DATEPART(hh, [Time Out]) = 8 ANd Cast([Date Out] as date) = Cast(getdate() as date)) as [0800], 
    (select Sum([Total Fee]) from Trans where DATEPART(hh, [Time Out]) = 9 ANd Cast([Date Out] as date) = Cast(getdate() as date)) as [0900], 
    (select Sum([Total Fee]) from Trans where DATEPART(hh, [Time Out]) = 10 ANd Cast([Date Out] as date) = Cast(getdate() as date)) as [1000], 
    (select Sum([Total Fee]) from Trans where Cast([Date Out] as date) = Cast(getdate() as date)) as Total 
From Trans 
Where [Bill Acct] between 9000 and 9200 
ANd Cast([Date Out] as date) = Cast(getdate() as date) 
And Void = 0 
Group By [Bill Acct], [Site Code] 
Order by [Site Code] 
+1

Итак, где проблема? – Rahul

+0

Используя приведенный выше запрос, я получаю итоговое значение для всех учетных записей за этот час и не могу понять, как получить общее количество для каждой учетной записи за час. – downeysyndrome

+0

По крайней мере, вам не хватает агрегированной функции во втором и третьем столбцах. Я также думаю, что вы хотели бы включить [код сайта] в предложение select - так как вы группируете его. Более фундаментально это очень неэффективный запрос. Почему не группировать DATEPART (hh, [Time Out]), а затем поворачивать результаты, чтобы получить ваши столбцы? Это устранит все эти подзапросы. Вам также понадобится объединить итог, но это того стоит. – Greenspark

ответ

2

Есть гораздо более эффективные способы написать запрос: сводная ведомость, или набор операторов Случае, как ниже, был бы гораздо быстрее. Есть некоторые отсутствующие агрегированные функции, как упоминал Greenspark, и у вас нет поля кода сайта в инструкции SELECT.

Предполагая, что один, все или некоторые из них являются проблемой, попробуйте следующее:

SELECT 
    [Bill Acct], 
    [Site Code], 
    SUM(CASE WHEN DATEPART(hh, [Time Out]) = 0 THEN [Total Fee] ELSE 0 END) AS [0000], 
    SUM(CASE WHEN DATEPART(hh, [Time Out]) = 1 THEN [Total Fee] ELSE 0 END) AS [0100], 
    SUM(CASE WHEN DATEPART(hh, [Time Out]) = 2 THEN [Total Fee] ELSE 0 END) AS [0200], 
    SUM(CASE WHEN DATEPART(hh, [Time Out]) = 3 THEN [Total Fee] ELSE 0 END) AS [0300], 
    SUM(CASE WHEN DATEPART(hh, [Time Out]) = 4 THEN [Total Fee] ELSE 0 END) AS [0400], 
    SUM(CASE WHEN DATEPART(hh, [Time Out]) = 5 THEN [Total Fee] ELSE 0 END) AS [0500], 
    SUM(CASE WHEN DATEPART(hh, [Time Out]) = 6 THEN [Total Fee] ELSE 0 END) AS [0600], 
    SUM(CASE WHEN DATEPART(hh, [Time Out]) = 7 THEN [Total Fee] ELSE 0 END) AS [0700], 
    SUM(CASE WHEN DATEPART(hh, [Time Out]) = 8 THEN [Total Fee] ELSE 0 END) AS [0800], 
    SUM(CASE WHEN DATEPART(hh, [Time Out]) = 9 THEN [Total Fee] ELSE 0 END) AS [0900], 
    SUM(CASE WHEN DATEPART(hh, [Time Out]) = 10 THEN [Total Fee] ELSE 0 END) AS [1000], 
    SUM([Total Fee]) AS Total 
FROM Trans 
WHERE 
    ([Bill Acct] BETWEEN 9000 AND 9200) AND 
    CAST([Date Out] AS DATE) = CAST(GETDATE() AS DATE) AND 
    Void = 0 
GROUP BY [Bill Acct], [Site Code] 
ORDER BY [Site Code] 
+0

Большое вам спасибо! Я смотрю на создание сводного заявления, но пока что твоя фантастическая! Спасибо! – downeysyndrome

1

Если я понял правильно, ваш выше запрос может быть упрощен к чему-то, как показано ниже

Select [Bill Acct], 
    [Total Fee], 
    Sum([Total Fee]) 
from Trans 
where DATEPART(hh, [Time Out]) in (0,1,2,3,4,5,6,7,8,9,10) 
ANd Cast([Date Out] as date) = Cast(getdate() as date)) 
AND [Bill Acct] between 9000 and 9200 
And Void = 0 
Group By [Bill Acct], [Total Fee] 
Order by [Site Code] 
+0

AHiggins исправил это для меня, я вижу, что я сделал не так, спасибо, хотя! – downeysyndrome

+0

Добро пожаловать. Не беспокойтесь, и так все учатся. – Rahul