#sql
#sql
Вопрос:
Мне просто нужно знать, как я могу получить итоговые данные по строкам за год. Вот мой код, и мне нужно получить приведенный ниже ожидаемый результат :
SELECT /* parallel(v,32) parallel(mm,32) parallel(c,32) */
'BUS' VEH_TYPE,
MM.MAKE_MO,
SUM (CASE WHEN SUBSTR (V.YEAR_Val, 1, 4) = '1990' THEN 1 ELSE 0 END)
AS FY1990,
SUM (CASE WHEN SUBSTR (V.YEAR_VAL, 1, 4) = '1991' THEN 1 ELSE 0 END)
AS FY1991,
SUM (CASE WHEN SUBSTR (V.YEAR_VAL, 1, 4) = '1992' THEN 1 ELSE 0 END)
AS FY1992,
SUM (CASE WHEN SUBSTR (V.YEAR_VAL, 1, 4) = '1993' THEN 1 ELSE 0 END)
AS FY1993,
SUM (CASE WHEN SUBSTR (V.YEAR_VAL, 1, 4) = '1994' THEN 1 ELSE 0 END)
AS FY1994,
SUM (CASE WHEN SUBSTR (V.YEAR_VAL, 1, 4) = '1995' THEN 1 ELSE 0 END)
AS FY1995,
COUNT (MM.MAKE_MO) Total_Count
FROM VEHICLE V, MAKE mm, CATEGORY c
WHERE C.MAKE_MO = mm.MAKE_MO
AND c.CATEGORY_CD = v.CATEGORY_CD
AND V.p_MONTH BETWEEN '199001' AND '199501' --using this as data is huge
AND C.TYPE_CODE=01
AND MM.VEH_CODE='B'
GROUP BY 'BUS,'MM.MAKE_MO, V.YEAR_Val
ORDER BY V.YEAR_Val;
Это ожидаемый результат :
VEH TYPE YEAR MODEL TOTAL
------- ----- --------
Bus 1990 7,808,658
Bus 1991 5,474,809
Bus 1992 54,839,221
Bus 1993 54,680,000
Bus 1994 15,000,000
Bus 1995 17,899,668
Комментарии:
1. Можете ли вы предоставить некоторые примеры данных? Мы видим, какие преобразования вы выполняете, но без каких-либо входных данных мы не можем делать никаких предположений относительно того, что находится в ваших таблицах
VEHICLE
,MAKE
иCATEGORY
.2. И что вы получаете сейчас? В чем ваш вопрос?
3. Это было бы полезно при вводе вместе с выводом (упрощает репликацию). Кроме того, попробуйте (словами) описать, чего вы хотите достичь.
4. Во-первых, »
FROM VEHICLE V, MAKE mm, CATEGORY c
» >>> Пожалуйста, пожалуйста, пожалуйста, не используйте старые соединения с синтаксисом запятой. Используйте фактические объединения ANSI-syle, это намного облегчит вашу жизнь. Кроме того, »ORDER BY 2
» >>> Использование порядковой позиции может затруднить отладку. проблемы. Оттуда вы выбираете 8 столбцов, но в вашем ожидаемом выводе отображаются только 3. Пожалуйста, предоставьте больше информации о том, что у вас есть и что вы пытаетесь сделать. Что-то вроде sqlfiddle.com или dbfiddle.uk поможет вам собрать хороший, полезный пример для других, с которым можно помочь.5. Вы храните даты в столбце char / varchar ?!? Используйте правильный тип данных даты!
Ответ №1:
Это было слишком долго для комментария. После развертывания этого запроса оказывается, что вы просто пытаетесь получить количество транспортных средств «Bus» по модельному году (при этом ВСЕ транспортные средства в VEHICLE
таблице помечены как «Bus»). Если это так, вы можете значительно упростить свой запрос.
SELECT VEH_TYPE
, theYear AS YEAR_MODEL
, COUNT(*) AS TOTAL
FROM (
SELECT 'BUS' AS VEH_TYPE
, SUBSTR(V.YEAR_Val,1,4) AS theYear
FROM VEHICLE V
INNER JOIN CATEGORY c ON v.CATEGORY_CD = c.CATEGORY_CD
AND C.TYPE_CODE='01'
INNER JOIN MAKE mm ON c.MAKE_MO = mm.MAKE_MO
AND MM.VEH_CODE='B'
WHERE V.p_MONTH BETWEEN '199001' AND '199501'
) s1
WHERE theYear IN ('1990','1991','1992','1993','1994','1995')
GROUP BY theYear
Вам может не понадобиться WHERE
предложение, если годы вашего автомобиля только 1990-1995. И ваши объединенные таблицы, похоже, не делают ничего, кроме ограничения вашей VEHICLE
таблицы, если в CATEGORY_CD
и VEHICLE
нет CATEGORY
совпадений, и если в MAKE_MO
и MAKE
нет CATEGORY
совпадений. Если вы выполняли фильтрацию по определенному столбцу из CATEGORY
или MAKE
, или у вас были потерянные записи в VEHICLE
, тогда вы захотите добавить эти объединения обратно. В противном случае, я не думаю, что они действительно что-то делают.
Обратите внимание, что SUBSTR(V.YEAR_Val,1,4)
это исключит любой индекс, который у вас есть V.YEAR_Val
, и если этот столбец вам нужен регулярно, или если есть много VEHICLE
записей, вам может потребоваться разделить это значение на отдельный столбец.
Комментарии:
1. @Shawn- Мне нужно, куда добавить другие условия фильтрации, которые я добавил, я не хотел загрязнять код, поэтому не привел подробных сведений о фильтре. Я просто хочу знать, как мне получить итоговые данные по строкам за год для этого запроса. В настоящее время у меня есть итоговые данные по столбцам.
2. @developer_07 Я не уверен, что вы имеете в виду. Я обновил свой код, чтобы снова добавить критерии объединения. И просто к вашему сведению, включение деталей, которые повлияют на результаты, не загрязняет код, но необходимо для правильного ответа на вопрос. Что вы подразумеваете под «итогами по строкам за год» и «итогами по столбцам»? Вам нужны итоговые данные за годы, как в вашем запросе? Если да, то каков основной подсчет столбцов итогов? Пожалуйста, обновите ожидаемый результат, если он отличается. Кроме того, если вы можете создать некоторые примеры данных, это помогло бы. SQLFiddle.com работает довольно хорошо для чего-то подобного.