2015-07-14 3 views
0

Я пытаюсь добавить общую строку к сгруппированному запросу. Запрос у меня есть, как показано ниже:Добавить общую строку в Grouped Query

SELECT T3.[SlpName], T1.[CardCode], T1.[CardName], T1.[ShipToCode], T2.[ItemCode], T2.[Dscription], 
SUM(T2.[Quantity]) AS 'Total Quantity', 
MAX(T2.[Price]) AS 'Line Price', 
SUM(T2.[LineTotal]) AS 'Line Total', 
SUM(T2.[GrssProfit]) AS 'Gross Profit' 
FROM OCRD T0 INNER JOIN OINV T1 ON T0.[CardCode] = T1.[CardCode] INNER JOIN INV1 T2 ON T1.[DocEntry] = T2.[DocEntry] INNER JOIN OSLP T3 ON T0.[SlpCode] = T3.[SlpCode] 
WHERE T3.[SlpName] = 'Name' AND T1.[createdate] >= DATEADD(day,-7, GETDATE()) 
GROUP BY T3.[SlpName], T1.[CardCode], T1.[CardName], T1.[ShipToCode], T2.[ItemCode], T2.[Dscription]. 

То, что я хочу, это общая строка для SUM линии - так в действительности сумма суммы.

Я попытался добавить общее значение с помощью предложения Union, но это дает мне сообщение об ошибке. Когда я использую функцию ROLLUP, она суммирует каждую строку, а не только строку, для которой требуется сводка. Может ли кто-нибудь помочь?

Большое спасибо.

+0

насчет 'SUM + SUM (T2 [LineTotal].) + SUM (T2 [GrssProfit].)' (T2 [Количество].)? –

+0

Какая ошибка вы получаете из запроса UNION и какой код вы пытались? –

+0

Я бы обернул это как подвыбор и сделаю КРОССУЮ ПРИЛОЖЕНИЕ в конце. ВНИМАНИЕ: нет никакой гарантии, что ваши ряды появятся в ожидаемом порядке. – Shnugo

ответ

1

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

SELECT T3.[SlpName] 
    , T1.[CardCode] 
    , T1.[CardName] 
    , T1.[ShipToCode] 
    , T2.[ItemCode] 
    , T2.[Dscription] 
    , SUM(T2.[Quantity]) AS 'Total Quantity' 
    , MAX(T2.[Price]) AS 'Line Price' 
    , SUM(T2.[LineTotal]) AS 'Line Total' 
    , SUM(T2.[GrssProfit]) AS 'Gross Profit' 
FROM OCRD T0 
INNER JOIN 
    OINV T1 
ON T0.[CardCode] = T1.[CardCode] 
INNER JOIN 
    INV1 T2 
ON T1.[DocEntry] = T2.[DocEntry] 
INNER JOIN OSLP T3 
ON T0.[SlpCode] = T3.[SlpCode] 
WHERE T3.[SlpName] = 'Name' 
AND  T1.[createdate] >= DATEADD(day,-7, GETDATE()) 
GROUP BY T3.[SlpName] 
    , T1.[CardCode] 
    , T1.[CardName] 
    , T1.[ShipToCode] 
    , T2.[ItemCode] 
    , T2.[Dscription] 
UNION 
SELECT NULL AS [SlpName] 
    , NULL AS [CardCode] 
    , NULL AS [CardName] 
    , NULL AS [ShipToCode] 
    , NULL AS [ItemCode] 
    , NULL AS [Dscription] 
    , SUM(T2.[Quantity]) AS 'Total Quantity' 
    , NULL AS 'Line Price' 
    , SUM(T2.[LineTotal]) AS 'Line Total' 
    , SUM(T2.[GrssProfit]) AS 'Gross Profit' 
FROM OCRD T0 
INNER JOIN 
    OINV T1 
ON T0.[CardCode] = T1.[CardCode] 
INNER JOIN 
    INV1 T2 
ON T1.[DocEntry] = T2.[DocEntry] 
INNER JOIN OSLP T3 
ON T0.[SlpCode] = T3.[SlpCode] 
WHERE T3.[SlpName] = 'Name' 
AND  T1.[createdate] >= DATEADD(day,-7, GETDATE()) 
+0

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

+0

Это дает мне именно то, что я хочу, и будет очень полезно для других запросов. Спасибо :) – Arrow

0

Может быть что-то вроде этого. Но это совершенно не тестировалась - поэтому нет никакой гарантии на все :-)

WITH mySums AS 
(
    SELECT ROW_NUMBER() OVER(ORDER BY T1.CardCode /*find your fitting order*/) AS PseudoIndex, 
    T3.[SlpName], T1.[CardCode], T1.[CardName], T1.[ShipToCode], T2.[ItemCode], T2.[Dscription], 
    SUM(T2.[Quantity]) AS 'Total Quantity', 
    MAX(T2.[Price]) AS 'Line Price', 
    SUM(T2.[LineTotal]) AS 'Line Total', 
    SUM(T2.[GrssProfit]) AS 'Gross Profit' 
    FROM OCRD T0 INNER JOIN OINV T1 ON T0.[CardCode] = T1.[CardCode] INNER JOIN INV1 T2 ON T1.[DocEntry] = T2.[DocEntry] INNER JOIN OSLP T3 ON T0.[SlpCode] = T3.[SlpCode] 
    WHERE T3.[SlpName] = 'Name' AND T1.[createdate] >= DATEADD(day,-7, GETDATE()) 
    GROUP BY T3.[SlpName], T1.[CardCode], T1.[CardName], T1.[ShipToCode], T2.[ItemCode], T2.[Dscription] 
) 
SELECT tbl.* FROM 
(
    SELECT * FROM mySums 
    UNION 
    SELECT 100000,NULL,NULL,NULL,NULL,NULL,NULL,SUM([Total Quantity]),SUM([Line Price]),SUM([Line Total]),SUM([Gross Profit]) 
    FROM mySums 
) AS tbl 
ORDER BY tbl.PseudoIndex 
+0

Спасибо за ответ. Я пробовал это, и он выполняется, но не возвращает никаких данных. – Arrow

+0

Было бы интересно, почему, но тем не менее я рад, что вы нашли решение! – Shnugo

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