Необходимо рассчитать сумму за год в желаемом формате вывода ниже, но я получаю данные по столбцам

#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 работает довольно хорошо для чего-то подобного.