у меня не было места, чтобы сделать название более описательным, извините, но это то, что я пытаюсь сделать:SQL - Как иметь несколько запросов в заявлении без петли или объединения всех
Я создание таблицы данных для гистограммы Google на веб-странице. Я просматриваю данные клиента и счета, и хочу получить снимок состояния клиента за каждую неделю предыдущего периода (неделя, месяц, квартал, год). Я знаю, что моя инструкция SELECT должна быть в течение недели, и я могу сделать это, используя UNION ALL, но это похоже на много кода для поддержки, если я хочу каждую неделю в течение последних трех лет. Там будут и другие фильтры, которые я снял для этого примера (MS SQL 2008):
SELECT COUNT(distinct customer.AccountNumber)
FROM Datahub..InvoiceHold invoice
INNER JOIN Datahub..CustomerBase as customer ON invoice.AccountNumber = customer.AccountNumber
INNER JOIN Datahub..OrderHold as orders ON invoice.AccountNumber = orders.AccountNumber
WHERE customer.CoNo = '003'
AND customer.CustomerStartDate <= GETDATE() - 7
AND invoice.InvoiceDate > GETDATE() - 7
AND orders.OrderDate > GETDATE() - 7
UNION ALL
SELECT COUNT(distinct customer.AccountNumber)
FROM Datahub..InvoiceHold invoice
INNER JOIN Datahub..CustomerBase as customer ON invoice.AccountNumber = customer.AccountNumber
INNER JOIN Datahub..OrderHold as orders ON invoice.AccountNumber = orders.AccountNumber
WHERE customer.CoNo = '003'
AND customer.CustomerStartDate <= GETDATE() - 14
AND invoice.InvoiceDate > GETDATE() - 14
AND orders.OrderDate > GETDATE() - 14
UNION ALL........And so on
Я думал о динамически писать строку SQL в моем вызывающем коде, и я могу легко сделать цикл там и сцепить строку запроса, которую я отправляю на MS SQL 2008. Но если я хочу сделать это в хранимой процедуре, как бы я сужу это до одного утверждения? Я читал, что использование циклов в SQL - это не-нет, за исключением узкого круга ситуаций, и я не понимаю использование курсоров. Кажется, это должно быть легко, но я не парень SQL.
EDIT Я пробовал представленные решения и не получал такого качества, которого я искал, как ни странно. Это заняло 7 минут или больше. Я не знаю, почему. В любом случае, я закончил делать некоторую фильтрацию данных и вытащил ее в память, а затем использовал LINQ в dataTable и пошел оттуда. Это может быть не очень красиво, но это занимает около 20 секунд.
Большое спасибо за ответы!
Почему бы не сохранить результаты запроса в таблице темпа? Вы можете создать цикл WHILE для отдельных недель и просто сохранить INSERT значения в таблице. – SchmitzIT
Вы можете добавить OVER к вашему счету и сделать их «функциями окна». Тогда вам нужен только один запрос с большим количеством подсчетов, который можно построить динамически. Однако я бы, скорее всего, рассмотрел только предварительные вычисления каждую неделю и сохранил их в таблице –