סכום סה"כ ב SQL

תאו

משתמש פעיל
D I G I T A L
איך אפשר לעשות סכום על טבלה לאורך ורוחב ז"א לכל שורה ולכל עמודה?
את הסכום של העמודות עשיתי ע"י with ROLLUP
איך אני עושה גם את הסכום של השורות ? (שיוסיף לי עמודה עם סה"כ לכל שורה )
 

Yehuda Kremer

משתמש פעיל
הנדסת תוכנה
D I G I T A L
כמו זה?
SgSQr25.png


הרצה: https://rextester.com/QIYVO56901
קוד:
קוד:
/* Create a table called MY_NUMBERS */
CREATE TABLE MY_NUMBERS(ID VARCHAR PRIMARY KEY, NUM1 INTEGER, NUM2 INTEGER, NUM3 INTEGER);

/* Create few records in this table */
INSERT INTO MY_NUMBERS VALUES(1, 32,36,85);
INSERT INTO MY_NUMBERS VALUES(2, 86,5,43);
INSERT INTO MY_NUMBERS VALUES(3, 457,37,1);
INSERT INTO MY_NUMBERS VALUES(4, 53,2,127);
INSERT INTO MY_NUMBERS VALUES(5, 8,7,565);

/* Display all the records from the table with SUM rows and columns */
SELECT DISTINCT COALESCE(ID, 'total') AS TOTAL, SUM(NUM1), SUM(NUM2),SUM(NUM3), SUM(NUM1 + NUM2 + NUM3) AS 'total'
FROM MY_NUMBERS
GROUP BY ID WITH ROLLUP
 

תאו

משתמש פעיל
D I G I T A L
כן בדיוק ,
אבל יש לי מספר רב של עמודות כך שאני לא יוכל לסכם את כל העומדות באופן ידני כמו בדוגמא ...
וגם אם אח"כ יתווספו עמודות בכל פעם צרי להוסיפם ידנית ולכן אני רוצה פתרון יעיל יותר ....
 

Yehuda Kremer

משתמש פעיל
הנדסת תוכנה
D I G I T A L
משורשרת שאילתא דינמית:
avLgAPW.png


הרצה: https://rextester.com/AVRDY48232
קוד:
קוד:
/* Create a table called MY_NUMBERS */
CREATE TABLE MY_NUMBERS(ID VARCHAR PRIMARY KEY, NUM1 INTEGER, NUM2 INTEGER, NUM3 INTEGER, NUM4 INTEGER);

/* Create few records in this table */
INSERT INTO MY_NUMBERS VALUES(1, 32,36,85, 82);
INSERT INTO MY_NUMBERS VALUES(2, 86,5,43, 76);
INSERT INTO MY_NUMBERS VALUES(3, 457,37,1, 68);
INSERT INTO MY_NUMBERS VALUES(4, 53,2,127, 59);
INSERT INTO MY_NUMBERS VALUES(5, 8,7,565, 27);


-- 1: STATIC QUERY

/* Display all the records from the table with SUM rows and columns */
SELECT DISTINCT COALESCE(ID, 'total') AS #, SUM(NUM1), SUM(NUM2),SUM(NUM3), SUM(NUM1 + NUM2 + NUM3) AS 'total'
FROM MY_NUMBERS
GROUP BY ID WITH ROLLUP


-- 2: DYNAMIC QUERY

/* Store columns names in temp table */
SELECT * INTO #MY_NUMBERS_COLUMNS
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'MY_NUMBERS'

DECLARE @MY_NUMBERS_COLUMNS_NAMES_SUM NVARCHAR(MAX)
SET @MY_NUMBERS_COLUMNS_NAMES_SUM =  STUFF((
    SELECT 'SUM(' + COLUMN_NAME + '), '
    FROM #MY_NUMBERS_COLUMNS
    WHERE COLUMN_NAME != 'ID'
    FOR XML PATH('')
), 1, 0, '');
-- output: SUM(NUM1), SUM(NUM2), SUM(NUM3),

DECLARE @MY_NUMBERS_COLUMNS_NAMES_COMMA NVARCHAR(MAX)
SET @MY_NUMBERS_COLUMNS_NAMES_COMMA =  STUFF((
    SELECT '+' + COLUMN_NAME
    FROM #MY_NUMBERS_COLUMNS
    WHERE COLUMN_NAME != 'ID'
    FOR XML PATH('')
), 1, 1, '');
-- output: NUM1+NUM2+NUM3

/* Using SP_EXECUTESQL */
DECLARE @QRY NVARCHAR(MAX)
SET @QRY = 'SELECT DISTINCT COALESCE(ID, ''total'') AS #, ' + @MY_NUMBERS_COLUMNS_NAMES_SUM +
    ' SUM(' + @MY_NUMBERS_COLUMNS_NAMES_COMMA + ') AS [total] ' +
    'FROM MY_NUMBERS ' +
    'GROUP BY ID WITH ROLLUP';
EXEC SP_EXECUTESQL @QRY
 

תאו

משתמש פעיל
D I G I T A L
אני יוצרת טבלה דינאמית :
בטבלה בסוף יש עמודה של C ועוד את כל העמודות שנשלפות מ @cols (מספר דינאמי של עמודות ) ובתוכו ממלא את הסכומים אני רוצה עמודה שתסכום לי עבור כל שורה ....

set @query='select distinct c COLLATE DATABASE_DEFAULT c, '+ (@cols)+'
into ##temp1 from
(
select #temp1001.namea c ,oprj.PrjName p,#temp1001.summ s ,
(
SELECT sum(summ )
FROM #temp1001
)aa

from #TEMP1001
join OPRJ
on oprj.prjcode = #temp1001.code
)x
pivot
(
max(s)
for p in (' + @cols + ')
) p '
execute(@query)
select * from ##temp1
 

אולי מעניין אותך גם...

הפרק היומי

הפרק היומי! כל ערב פרק תהילים חדש. הצטרפו אלינו לקריאת תהילים משותפת!


תהילים פרק קכב

א שִׁיר הַמַּעֲלוֹת לְדָוִד שָׂמַחְתִּי בְּאֹמְרִים לִי בֵּית יְהוָה נֵלֵךְ:ב עֹמְדוֹת הָיוּ רַגְלֵינוּ בִּשְׁעָרַיִךְ יְרוּשָׁלִָם:ג יְרוּשָׁלִַם הַבְּנוּיָה כְּעִיר שֶׁחֻבְּרָה לָּהּ יַחְדָּו:ד שֶׁשָּׁם עָלוּ שְׁבָטִים שִׁבְטֵי יָהּ עֵדוּת לְיִשְׂרָאֵל לְהֹדוֹת לְשֵׁם יְהוָה:ה כִּי שָׁמָּה יָשְׁבוּ כִסְאוֹת לְמִשְׁפָּט כִּסְאוֹת לְבֵית דָּוִיד:ו שַׁאֲלוּ שְׁלוֹם יְרוּשָׁלִָם יִשְׁלָיוּ אֹהֲבָיִךְ:ז יְהִי שָׁלוֹם בְּחֵילֵךְ שַׁלְוָה בְּאַרְמְנוֹתָיִךְ:ח לְמַעַן אַחַי וְרֵעָי אֲדַבְּרָה נָּא שָׁלוֹם בָּךְ:ט לְמַעַן בֵּית יְהוָה אֱלֹהֵינוּ אֲבַקְשָׁה טוֹב לָךְ:
נקרא  2  פעמים

לוח מודעות

למעלה