Chủ Nhật, 16 tháng 8, 2020

Hàm Ora thường xài

-- reset lại sequence ALTER TABLE BPM_OCB.DON_VI_CHUC_DANH MODIFY ID GENERATED BY DEFAULT ON NULL AS IDENTITY ( START WITH 150000); alter sequence danh_muc_seq restart start with 100; -- xóa duplicate DELETE FROM your_table WHERE rowid not in (SELECT MIN(rowid) FROM your_table GROUP BY column1, column2, column3); -- bẻ 1 cột có chứa dữ liệu ,,, thành cột SELECT gd_id, LISTAGG(b.ten, ', ') WITHIN GROUP(ORDER BY A.GD_ID) AS LY_DO_NGOAI_LE FROM ( SELECT gd_id, REGEXP_SUBSTR(LY_DO_ID, '[^,]+', 1, LEVEL) str FROM LY_DO_KHAC a WHERE (SUBSTR(A.GD_ID,0,2) = 'HT' OR SUBSTR(A.GD_ID,0,3) = 'PHT') CONNECT BY REGEXP_SUBSTR(LY_DO_ID, '[^,]+', 1, LEVEL) IS NOT NULL AND PRIOR id = id AND PRIOR SYS_GUID() IS NOT NULL ORDER BY gd_id ) a left join DANH_MUC b on a.str = to_char(b.id) and b.loai = 6391 group by gd_id --- check câu lệnh chạy quá 30s select s.username,s.sid,s.serial#,s.last_call_et/60 mins_running,q.sql_text from v$session s join v$sqltext_with_newlines q on s.sql_address = q.address where status='ACTIVE' and type <>'BACKGROUND' and last_call_et> 30 and S.USERNAME != 'SYSTEM' order by s.last_call_et desc,sid,serial#,q.piece;

Thứ Năm, 7 tháng 6, 2012

Mấy cái hàm Ora thông dụng

TO_CHAR

Convert a numeric or date expression to a character String.
Syntax
      to_char(expression [,'format'] [,nls_format])

Key
   char      The DATE, NUMBER or expression to convert
   format    Format to use.
   nls_lang  The international language to use.
The format may be either a DATE format (YYYY=year, MM=month, DD=Day, HH=Hour, Mi=Minute )
or a NUMBER format (0999=include leading zero).

If no format is specified Oracle will use the default date format.
nls_format allows international formats to be applied.
TO_CHAR will convert NCHAR, NVARCHAR2, CLOB, or NCLOB data to the database character set.
Examples
SQL> Select to_char(sysdate, 'yyyy/mm/dd') FROM dual;
 '2010/12/24'

SQL> Select to_char(sysdate, 'FMMonth DD, YYYY') FROM dual;
 'June 9, 2005'

SQL> select to_char(sysdate,'HH24:MI:SS') "Time Now" from dual;
 '14:35:56'

SQL> Select to_char(1.234, '9999.9') FROM dual;
 '1.2'

SQL> Select to_char(1000.25, '9,999.99') FROM dual;
 '1,000.25'

SQL> Select to_char(1000.25, '$9,999.00') FROM dual;
 '$1,000.25'

SQL> Select to_char(25, '000099') FROM dual;
 '000025'

SQL> Select to_char(-50, 'PR999') FROM dual;
 '<50>'

SQL> Select to_char(17, 'RN99') FROM dual;
 'XVII'

SQL> Select to_char('01110' + 1) FROM dual;
 1111

SQL> Select to_char(timestamp, 'DD-MM-YYYY HH24:MI') FROM dual;
 31-12-2005 23.30
Convert a character string into an Oracle date, then convert back to a string with a different date format:
SQL> Select to_char(mydate,'DD-MON-RR HH12:MI') Short_Date_Time
 from (
   select to_date('1-MAR-2010 23:24','DD-MON-RRRR HH24:MI') mydate
   from dual
 );

TO_DATE

Convert an expression to a date value.
Syntax to_date(char[,'format'[,nls_lang]) Key char String expression that will be converted to a date format Date format to use. nls_lang The international language to use. to_date will convert either a character string or an expression into a date value.

The 'format' must be a valid DATE format: YYYY=year, MM=month, DD=Day, HH=Hour, Mi=Minute
If no format is specified Oracle will assume the default date format has been supplied in char.
Examples
to_date('29-Oct-09', 'DD-Mon-YY') to_date('10/29/09', 'MM/DD/YY') to_date('120109', 'MMDDYY') to_date('29-Oct-09', 'DD-Mon-YY HH:MI:SS') to_date('Oct/29/09', 'Mon/DD/YY HH:MI:SS') to_date('October.29.2009', 'Month.DD.YYYY HH:MI:SS') SQL> select * from sales where order_date > to_date('29-Oct-09', 'DD-Mon-YY'); To check that year 2000 dates are appearing correctly try the following:
SELECT to_char(add_months(to_date('01-JAN-1998', 'DD-MON-YYYY'),1 * 12),'DD-MON-YYYY') y1999, to_char(add_months(to_date('01-JAN-1998', 'DD-MON-YYYY'),2 * 12),'DD-MON-YYYY') y2000, to_char(add_months(to_date('01-JAN-1998', 'DD-MON-YYYY'),7 * 12),'DD-MON-YYYY') y2005, to_char(add_months(to_date('01-JAN-1998', 'DD-MON-YYYY'),52 * 12),'DD-MON-YYYY') y2050 FROM DUAL; -- Expected output -- Y1999 Y2000 Y2005 Y2050 -- ----------- ----------- ----------- ----------- -- 01-JAN-1999 01-JAN-2000 01-JAN-2005 01-JAN-2050
 

TO_NUMBER

Convert a string expression to a number
Syntax to_number(char[,'format'[,nls_lang]) Key char String expression that will be converted to a number format Date format to use. nls_lang The international language to use. You can convert a character or expression that contains a number into an actual number value.

The 'format' must be a valid Number format.

nls_lang allows international formats to be applied e.g. currency symbols and numeric chars.
ORA-01722: invalid number - error thrown if TO_NUMBER is passed a string that doesn't represent a number. See René Nyffenegger's safe_to_number function.
Examples
SQL> Select to_number('1234.64') from Dual;
1234.64
SQL> Select to_number('1234.64', '9999.9') from Dual;
1234.6
SQL> Select to_number('$99.64', 'L99D99') from Dual;
99.64

CASE and Width_Bucket Functions

Case Function
A flexible method of grouping data into even or unevenly sized buckets.
Very similar to DECODE
Syntax:
CASE WHEN <cond1> THEN <Value1>
     WHEN <cond2> THEN <Value2>
     [ELSE Value n ] END   
A single CASE statement can be selected (along with other columns), resulting in a vertical list of data buckets. Alternatively several case statements can be summed to display totals in a horizontal row:

 SELECT CASE WHEN sal>1000 THEN 'Over paid'
             ELSE 'Under paid' END
 FROM   emp;


 SELECT SUM(CASE WHEN SUM(amount) BETWEEN 0 AND 49 THEN 1 
            ELSE 0 END) AS "0-49",
        SUM(CASE WHEN SUM(amount) BETWEEN 50 AND 100
           THEN 1 ELSE 0 END) AS "50-100"
 FROM sales;
 
WIDTH_BUCKET Function
Divide a data set into buckets with an equal interval size.
e.g. Age = 0-20, 20-40, 40-60, 60-80…
This is known as an 'equiwidth histogram'.
Syntax:
WIDTH_BUCKET(column/expr, low boundary, high_boundary,
              bucket_count)

If you ask for (n) buckets you actually get (n+2) buckets
The extra 2 being for values above and below the high/low boundaries.

e.g.
SELECT last_name, salary,
       WIDTH_BUCKET(salary,3000,9000,3)

Will create 5 buckets:
Up_to_3000, 3000-5000, 5000-7000, 7000-9000, 9000+
When using WIDTH_BUCKET pay attention to the boundary values, each bucket will contain values equal to or greater than the lowest boundary of that bucket, so age ranges 0-20, 20-40… would actually be 0-19.99 and 20-39.999…

"Our team is well balanced. We have problems everywhere." - Tommy Prothro


mấy cái lụm lặt (SQL)

Oracle SQL Functions

Functions:
ABS(n)        Absolute value of number
ACOS(n)       arc cosine of n
ADD_MONTHS(date,num_months)
              Returns date + num_months
ASCII(char)   Converts char into a decimal ascii code
ASIN(n)       arc sine of n.
ATAN(n)       arc tangent of n. 
ATAN2(n.m)    arc tangent of n and m. 
AVG([DISTINCT]n)
              Averge value of 'n' ignoring NULLs

BETWEEN value AND value
              Where 'x' between 25 AND 100
BFILENAME('directory','filename')
              Get the BFILE locator associated with a physical LOB binary file.

CASE          Group the data into sub-sets.
CEIL(n)       Round n up to next whole number.
CHARTOROWID(char)
              Converts a Char into a rowid value.
CHR(n)        Character with value n
CONCAT(s1,s2) Concatenate string1 and string2
CONVERT(char_to_convert, new_char_set, old_char_set)
              Convert a  string from one character set to another.
COS(n)        Cosine of number
COSH(n)       Hyperbolic Cosine of number
COUNT(*)      Count the no of rows returned
COUNT([DISTINCT] expr)
              Count the no of rows returned by expr
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP

DECODE        IF x THEN return y ELSE return z
DENSE_RANK    Calculate the rank of a value in a group
DEREF(e)      Return the object reference of argument e. 
DUMP(expr,fmt[,start,length])
              Convert to dec/hex/oct and display char set

EMPTY_BLOB    Return an empty LOB locator (use to empty a column or variable)
EMPTY_CLOB    Return an empty LOB locator (use to empty a column or variable)
EXISTS        Return TRUE if a subquery returns at least one row
EXP(n)        Exponential (e to 'n'th power)
EXTRACT       Extract part of a DATE (Year,Month,Day,Second,etc)

FLOOR(n)      Round n down to the next whole number.

GREATEST(expression, expression…)
              Returns the largest in a list of expressions.
GROUPING      Grouping for superaggregate rows=NULL
              (see GROUP BY ROLLUP/CUBE)

HEXTORAW(char) Convert char containing hex digits to a raw value.

IN (list of comma separated values)
              Effectively a shorthand for ['x' = y OR 'x' = z…] i.e.
              Where 'x' IN ('sales','marketing','recruitment')
INITCAP(char) String with Initial Capitals
INSTR(str, chars[,s[,n]])
              Find the 'n'th occurence of 'chars' in 'str'
              Starting at position 's'
              n and s default to 1
INSTRB (str, chars[,s[,n]])
              The same as INSTR, except that 's' and the return value are expressed in bytes,
              use for double-byte char sets.
IS NULL       Check for NULL (empty) values  (Select * from demo Where x IS NULL;)
IS NOT NULL   Check for items that contain a value (Select * from demo Where x IS NOT NULL;)

LAST_DAY(date)Returns the last day of month in Date
LEAST(expression, expression…)
              Returns the smallest in a list of expressions
LENGTH(char)  Returns the number of characters in char
LENGTHB(char) Returns the number of bytes in char (use for double-byte char sets)
LIKE wildcard/value
              Wildcards are [% = any chars] [ _ = any one char]
              Where 'x' LIKE 'smith%' [will find 'Smithson']
              Where 'x' LIKE 'smith_' [will find 'Smithy']
LN(n)         Natural Log of n, where n>0
LOG(b,n)      log of n, base b
LOWER(char)   Returns character string in lowercase
LPAD(char, n[,PadChar])
              Left Pad char with n spaces [or PadChars]
LTRIM(char[,set])
              Left Trim char - remove leading spaces [or char set]

MAKE_REF(table,key)
              Create a REF to a row of an OBJECT view/table
MAX([DISTINCT] expr)
              Maximum value returned by expr
MIN([DISTINCT] expr)
              Minimum value returned by expr
MOD(x,y)      Remainder of x divided by y
MONTHS_BETWEEN(end_date, start_date)
              Number of months between the 2 dates (integer)

NEW_TIME(date, zone1, zone2)
              Convert between GMT and US time zones (but not CET)
NEXT_DAY(date,day_of_week)
              '12-OCT-01','Monday' will return the next Mon after 12 Oct
NLS_CHARSET_DECL_LEN (bytecount,charset)
              Returns the declaration width (no of chars) of an NCHAR column
NLS_CHARSET_ID(varchars)
              Returns the char set ID given a charset name
NLS_CHARSET_NAME(charset_id)
              Returns the char set name given a charset id
NLS_INITCAP(char[,'NLS_SORT = sort_sequence'])
              Returns char in Initial Caps, using an NLS sort_sequence
              either the session default or specified directly
NLS_LOWER(char[,'NLS_SORT = sort_sequence'])
              Returns char in lower case, using an NLS sort_sequence
              either the session default or specified directly
NLSSORT(char[,'NLS_SORT = sort_sequence'])
              Return the string of bytes used to sort char, using an NLS sort_sequence
              either the session default or specified directly
NLS_UPPER(char[,'NLS_SORT = sort_sequence'])
              Returns char in UPPER case, using an NLS sort_sequence
              either the session default or specified directly
NVL(expression, value_if_null)
              If expression is null, returns value_if_null; if expression is not null, returns expression.
              The arguments can have any datatype (Oracle will perform implicit conversion where needed).
PERCENT_RANK  Calculate the percent rank of a value in a group.
POWER(m,n)    m raised to the nth power

RANK          Calculate the rank of a value in a group
RAWTOHEX(raw) Convert raw to a character value containing its hex equivalent
REF(table_alias)
              Returns a REF value for an object instance (bound to the variable or row.)
              The table alias (correlation variable) is associated with
              one row of an object table or an object view in an SQL statement.
REFTOHEX(ref) Convert ref (object type) to a char value containing its hex equivalent.
REPLACE(char, search_str[, replace_str])
              ANSI alternative to decode() Replace every occurrence of search_str
              with replace_str, replace_str defaults to null.
ROUND(n,d)    n rounded to d decimal places (d defaults to 0)
ROUND(date,fmt)
              date rounded to fmt
ROWIDTOCHAR(rowid)
              Convert a rowid value to VARCHAR2
ROW_NUMBER    Assign a unique number to each row of results. 
RPAD(char, n[,PadChar])
              Right Pad char with n spaces [or PadChars]
RTRIM(char[,set])
              Right Trim char - remove trailing spaces [or char set]

SIGN(n)       positive = 1, zero = 0, negative = -1
SIN(n)        Sine of n in Radians.
SINH(n)       Hyperbolic Sine of n in Radians.
SOUNDEX(char) Returns a char value representing the sound of the words.
SQRT(n)       Square Root (returns NULL for negative no's)
STDDEV([DISTINCT] n)
              Standard deviation of n.
SUBSTR(char, s[,l])
              A substring of char, starting at character s, length l.
SUBSTRB(char, s[,l])
              A substring of char, starting at character s, length l
              The same as SUBSTR, except that 's', 'l' and the return value are expressed in bytes,
              use for double-byte char sets.
SUM([DISTINCT] n)
              Sum of values of n, ignoring NULLs
SYS_CONTEXT('namespace','attribute_name')
              Examine the package associated with the context namespace 
              Possible attributes are: NLS_TERRITORY, NLS_CURRENCY, NLS_CALENDAR 
              NLS_DATE_FORMAT, NLS_DATE_LANGUAGE, NLS_SORT, SESSION_USER, CURRENT_USER
              CURRENT SCHEMAID,SESSION_USERID, CURRENT_USERID, CURRENT_SCHEMA
              note: CURRENT_USER may be different from SESSION_USER within a stored procedure
              (e.g an invoker-rights procedure).  
SYS_CONTEXT ('USERENV','IP_ADDRESS')
SYS_GUID()    Returns a globally unique identifier (16 byte RAW value)
SYSDATE       The current system date & time

TAN(n)        Tangent of n in Radians
TANH(n)       Hyperbolic tangent of n in Radians
TO_BLOB(Raw_col)  Convert LONG RAW and RAW values to BLOB
TO_CHAR       Convert to a character String
TO_CLOB       Convert character or NCLOB values to the database character set.
TO_DATE       Convert to date value
TO_LOB(long)  Convert LONG values to CLOB or NCLOB values
              or convert LONG RAW values to BLOB values
TO_MULTI_BYTE(char)
              Convert single-byte char to multi-byte char
TO_NCHAR(expr) Convert a TEXT expression, date, or number to NTEXT in a specified format.
               Mostly used to format output data.
TO_NCLOB      Convert any character string (including LOBs) to the national character set.
TO_NUMBER     Convert to numeric format
TO_SINGLE_BYTE(char)
              Convert multi-byte char to single-byte character.
TO_TIME       Convert to time value
TO_TIME_TZ    Convert to time zone
TO_TIMESTAMP  Convert to timestamp 
TO_TIMESTAMP_TZ
TO_YMINTERVAL Convert a character string to an INTERVAL YEAR TO MONTH type
TRANSLATE('char','search_str','replace_str')
              Replace every occurrence of search_str with replace_str
              unlike REPLACE() if replace_str is NULL the function returns NULL
TRANSLATE (text USING charset)
              Convert text into a specific character set
              Use this instead of CONVERT() if either the input or output datatype
              is NCHAR or NVARCHAR2.
TRIM(LEADING|TRAILING|BOTH trim_char FROM trim_source)
              Return trim_source as a VARCHAR2 with leading/trailing items removed
              trim_char defaults to a space ' ' but may be numeric or char 'A' 
TRUNC(i,d)    Truncate i to d decimal places (d defaults to 0)
TRUNC(date,fmt) Truncate Date to nearest fmt.
UID           User id (a unique number)
UPPER(char)   Return characters in uppercase
USER          Return the current Username
USERENV('option')
              Can return any of the options: ENTRYID, SESSIONID,
              TERMINAL, LANGUAGE, ISDBA, LANG, INSTANCE, CLIENT_INFO

VALUE(correlation_variable)
              Return the object instance for a row of an object table 
              as associated with the correlation_variable (table alias)
VARIANCE([DISTINCT] n)
              Variance of n, ignoring NULLs
VSIZE(expr)   Value Size, returns the number of bytes used by each row of expr.
Examples
Return the left 4 characters from the column prod_code, like a left() function in other languages:
SQL> select substr(prod_code,1,4) from sales;
Return the right 3 characters from the column prod_code, like a right() function in other languages:
SQL> select substr(prod_code,-3) from sales;
Return the leftmost 2 digits of idnum:
SQL> select substr(to_char(idnum),1,2) from mytable;
This page is not an exhaustive list of all the functions available - to find a complete list of functions for a particular release of Oracle see docs.oracle.com or run this query:

SELECT distinct object_name
FROM all_arguments
WHERE package_name = 'STANDARD';


_____________________________________________________
cái ở trên copy cho đủ thôi, đọc chắc cũng lười, haha, mấy cái này hay sử dụng nè:

__To_char('x','00000') : cái này mạnh kinh. so với SQL server có lẽ cái này hữu dụng nhất, dùng để định dạng 1 chuỗi cần xuất ra. Có thể định dạng chuỗi ngày tháng, chuỗi số, ký tự theo 1 định dạng nhất định....
VD như to_char('x','0000')=000x, hay to_char(date,'ddmmyyyy')=ngày tháng năm theo chuẩn. Cái này trong SQL cũng có ...

__Lpad('x',5,'0') có nghĩa là thêm vào bên trái chữ x những số 0 sao cho tổng ký tự là 5 ký tự
tương tự với Rpad()

__Replace() cái này thì quen rồi :))

__ || cộng gộp hai chuỗi .

Thứ Tư, 6 tháng 6, 2012

Một số hàm xử lý chuỗi trong sql

Một số hàm xử lý chuỗi trong sql



SQL
Trong sql có lẽ chúng ta cũng sử dụng nhiều các hàm xử lý chuỗi. Dưới đây là các hàm xử lý chuỗi trong sql

- ASCII
Hàm này trả về giá trị ASCII của keyboard ví dụ (@,R,9,*)
Cú pháp- ASCII ( character)
Ví dụ:
SELECT ASCII('a') -- giá trị trả về= 97
SELECT ASCII('b') -- giá trị trả về= 98
SELECT ASCII('c') -- giá trị trả về= 99
SELECT ASCII('A') -- giá trị trả về= 65
SELECT ASCII('B') -- giá trị trả về= 66
SELECT ASCII('C') -- giá trị trả về= 67
SELECT ASCII('1') -- giá trị trả về= 49
SELECT ASCII('2') -- giá trị trả về= 50
SELECT ASCII('3') -- giá trị trả về= 51
SELECT ASCII('4') -- giá trị trả về= 52
SELECT ASCII('5') -- giá trị trả về= 53
- SPACE
Hàm này trả về khoảng trống trong câu lệnh sql
Cú pháp - SPACE ( integer)
Ví dụ:
SELECT ('SQL') + SPACE(0) + ('TUTORIALS')-- giá trị trả về= SQLTUTORIALS
SELECT ('SQL') + SPACE(1) + ('TUTORIALS')-- giá trị trả về = SQL TUTORIALS
- CHARINDEX
Trả về vị trí được tìm thấy của một chuỗi trong chuỗi cha
Cú pháp - CHARINDEX ( string1, string2 [ , start_location ] )
Ví dụ:
SELECT CHARINDEX('SQL', 'Well organized understand SQL tutorial')-- Value = 27
SELECT CHARINDEX('SQL', 'Well organized understand SQL tutorial', 20)-- Value = 27
SELECT CHARINDEX('SQL', 'Well organized understand SQL tutorial', 30)-- Value = 0 (bởi vì giá trị bắt đầu truyền vào từ ký tự 30 trở đi)
- REPLACE
Hàm thay thế chuỗi
Ví dụ:
Cú pháp- REPLACE ( 'string1' , 'string2' , 'string3' )
SELECT REPLACE('All Function' , 'All', 'SQL')-- Value = SQL Function
- UPPER, LOWER
Hàm chuyển đổi thành chữ hoa và chữ thường
Ví dụ:
Cú pháp
- UPPER( 'string1')
- LOWER( 'string1')
SELECT UPPER('Khong con mua thu')-- Value = 'KHONG CON MUA THU'
SELECT LOWER('kHONG CON MUA THU')-- Value = 'khong con mua thu'

- LEFT,RIGHT,SUBSTRING
Hàm cắt chuỗi bên trái, phải và ở giữa
Ví dụ:
Cú pháp
- LEFT( 'string1', số kí tự)
- RIGHT( 'string1', số kí tự)
- SUBSTRING ( 'string1', vị trí, số kí tự)
SELECT LEFT('Khong con mua thu',5)-- Value = 'Khong'
SELECT RIGHT('kHONG CON MUA THU',3)-- Value = 'THU'
SELECT SUBSTRING ('kHONG CON MUA THU',6,3)-- Value = 'CON'

- LTRIM, RTRIM
Loại bỏ khoảng trắng bên trái, bên phải
Ví dụ:
Cú pháp
- LTRIM( 'string1')
- RTRIM ( 'string1')
SELECT LTRIM(' Khong con mua thu')-- Value = 'Khong con mua thu'
SELECT RTRIM ('kHONG CON MUA THU ')-- Value = 'kHONG CON MUA THU'

- LEN
Trả về số ký tự trong chuỗi
Ví dụ:
Cú pháp
- LEN( 'string')
SELECT LEN('Khong con mua thu')-- Value = 17

- REVERSE
Đảo chuối
Ví dụ:
Cú pháp
- REVERSE( 'string')
SELECT REVERSE('Khong con mua thu')-- Value = 'uht aum noc gnohK'

- STUFF
Với cú pháp hàm STUFF bên dưới có kết quả trả về là một chuỗi mới sau khi đã hủy bỏ một số ký tự hiện có và thêm vào một chuỗi con khác tại vị trí vừa hủy bỏ
Ví dụ:
Cú pháp
- STUFF ( 'string',vị trí, chiều dài, chuỗi con)
vị trí: là một số nguyên chỉ định vị trí bắt đầu hủy bỏ các ký tự bên trong chuỗi nguồn.
chiều dài: là một số nguyên chỉ định bao nhiêu ký tự sẽ bị hủy bỏ trong chuỗi nguồn đếm từ bên trái vị trí chỉ định.
SELECT STUFF ('123456789',4,3,'ABDCEF')-- Value = '123ABCDEF789'

Thứ Hai, 4 tháng 6, 2012

Công việc mới



1/6, ngày quốc tế thiếu nhi thì mình nhận được việc mới, công việc khá thử thách vì nó là những mảng mình chưa bao giờ làm (chắc tại mình làm ít quá đây mà keke) là mảng về triển khai, mảng ngân hàng, kế toán , oracle, java..... nói chung là zin nguyên con :))




.. viết tạm mấy dòng lấy cảm hứng tối viết tiếp..

\..quái, sao hnay lại có hứng viết blog vậy ta :))

Thứ Ba, 15 tháng 3, 2011

Việt Nam nợ thế giới bao nhiêu????

Phải nói ngay rằng bài này không có mục đích bàn về kinh tế, nhưng chỉ mượn bài viết của bác Vũ Thành Tự Anh để bàn về cách trình bày con số thống kê kinh tế và ý nghĩa của những con số đó.  Đọc bài của Tự Anh mấy lần, nhưng tôi không cách gì hiểu được bởi vì những con số trong đó cứ nhảy nhót tứ tung cả.

Giới kinh tế gia là bậc thầy của thống kê. Họ nói cái gì cũng có con số kèm theo.  Họ rất thích con số phần trăm.  Phần trăm tăng trưởng.  Phần trăm GDP.  Nhưng thú thật, nhiều khi đọc qua những con số quá lớn, tôi không có cảm giác gì cả.  Chẳng hạn như có con số nói rằng các doanh nghiệp Nhà nước Việt Nam đang nợ 300,000 tỉ đồng (chỉ là ví dụ), thì làm sao tôi có thể hình dung ra qui mô đó lớn như thế nào.  Thành ra, phải qui ra con số phần trăm của GDP thì dễ hiểu hơn.  Hóa ra, con số tỉ trọng nợ trên GDP là một chỉ tiêu quan trọng để đánh giá nguy cơ một quốc gia sẽ vỡ nợ.  Do đó, con số của nhà kinh tế rất quan trọng, cần phải xem xét cho thật kĩ để hiểu vấn đề.
Theo báo chí thì Việt Nam là nước có nguy cơ cao bị vỡ nợ vì các doanh nghiệp thuộc Nhà nước quản lí thiếu nợ nhiều quá.  Một cách để biết qui mô thiếu nợ là thể hiện số tiền thiếu nợ nước ngoài như là một tỉ lệ của GDP. Tuy nhiên, đọc bài báo trên Thời báo Kinh tế Sài Gòn thì tôi vẫn chẳng biết Việt Nam thiếu nợ bao nhiêu, vì cách trình bày con số quá rối rắm, và có khi không hợp lí.  Dưới đây là vài lí giải tại sao có những con số không hợp lí:
1.  Chúng ta thử đọc xem năm 2008, các doanh nghiệp Nhà nước nợ bao nhiêu.  Vào đầu, Tự Anh viết “[…] tính đến 31-12-2008, tổng dư nợ nội địa của các tập đoàn, tổng công ty nhà nước là 287.000 tỉ đồng. Nếu tính cả nợ nước ngoài thì đến cuối 2008, tổng nợ của khu vực doanh nghiệp nhà nước (DNNN) xấp xỉ 23,9% GDP.”  Câu này thì tôi hiểu như sau: đến cuối năm 2008, số tiền mà các DNNN nợ chiếm xấp xỉ 24% GDP của Việt Nam.  Nhưng 24% là bao nhiêu USD?  Theo nguồn này thì GDP của Việt Nam năm 2008 là 84.98 tỉ USD.  Như vậy, tính đến cuối năm 2008 các DNNN nợ 20.31 tỉ USD.
2.  Bây giờ chúng ta xem qua con số của năm 2009.  Bài báo cho biết: “Trong năm 2009, theo báo cáo của Chính phủ gửi Quốc hội ngày 1-11-2010 thì nợ của 81/91 tập đoàn, tổng công ty nhà nước (chưa tính Vinashin) là 813.435 tỉ đồng, tương đương với 49% GDP. Nếu tính cả nợ của Vinashin, theo báo cáo của Bộ Tài chính là 86.000 tỉ, thì nợ của khu vực DNNN đến cuối năm 2009 (không kể chín tập đoàn, tổng công ty chưa có số liệu) đã lên tới 54,2% GDP năm 2009.”
Tôi hiểu câu này như sau: đến cuối năm 2009, số tiền mà các tập đoàn DNNN nợ là 813,435 + 86,000 = 899,435 tỉ đồng, chiếm 54.2% GDP của Việt Nam.  Suy ra, GDP của Việt Nam trong năm 2009 là 1,659,474 tỉ đồng (hay khoảng 83 tỉ USD, tính theo 1 USD = 20,000 đồng), thấp hơn 2008 (84.98 tỉ USD)! Con số GDP [83 tỉ USD] này xem ra không hợp lí, bởi vì chúng ta biết rằng kinh tế Việt Nam tăng trưởng hàng năm từ 6 đến 8%. Thật vậy, theo số liệu của Bộ Ngoại giao Mĩ GDP của VN năm 2009 là 92.6 tỉ USD. Con số có vẻ hợp lí hơn là 83 tỉ USD, vì nó thể hiện tăng 9% so với 2008. Nhưng chúng ta vẫn phải dè dặt vì con số này không xuất phát từ nguồn chính thức của Việt Nam.
Vấn đề do đó đặt ra là con số nợ là đúng hay con số GDP sai? Giả dụ như con số về nợ là đúng thì tính đến năm 2009, các doanh nghiệp Nhà nước nợ 44.97 tỉ USD.  Thử đặt vào một bảng số liệu để dễ hiểu:
2008
2009
Tỉ lệ tăng trưởng
GDP (tỉ USD)
84.98
92.60
9 %
Nợ của DNNN (tỉ USD)
20.31
44.97
122 %
Như vậy, chỉ trong vòng 1 năm mà số tiền nợ của DNNN tăng hơn 2 lần. Có lẽ chính vì thế mà giới tài chính quốc tế đánh giá Việt Nam là một trong 18 nước có nguy cơ vỡ nợ cao.
3.  Bài báo có kèm theo một biểu đồ để minh họa, nhưng cách trình bày dữ liệu thì rất rối rắm.  Trục tung của biểu đồ là phần trăm (tỉ trọng GDP).  Trục hoành là năm.  Mỗi bar có 2 phần: phần dưới thể hiện nợ của DNNN, và phần trên là “Nợ của chính phủ”. Con số nợ của DNNN trong năm 2008 và 2009 (23.9% và 54.2%) được đề cập trong bài viết. Nhưng con số nợ của Chính phủ (36.2% bà 44.7%) thì hoàn toàn không được đề cập trong bài viết! Trình bày con số trong biểu đồ mà không có diễn giải là một "đại kị" trong khoa học.


Tôi không hiểu được biểu đồ này nói lên điểm gì.  Con số 36.2% và 44.7% đề cập cụ thể đến cái gì?  Nếu cộng 2 con số nợ của DNNN và nợ của chính phủ lại thì năm 2009, tổng số nợ chiếm 98.9% GDP sao? Nợ đến mức đó thì vỡ nợ rồi!  Khó hiểu quá. 
Ngoài ra, đường nối giữa hai con số có nghĩa là gì?  Cần nói thêm rằng một qui ước chung trong khoa học là không ai dùng biểu đồ để thể hiện những con số đã đề cập trong văn bản cả, vì làm như thế là thừa.
Bài viết còn có một thông tin mà tôi không cách gì hiểu nổi.  Đó là đoạn “Nếu nhìn vào con số tuyệt đối, sau khi trừ đi các khoản nợ nước ngoài và với những tính toán thận trọng nhất thì trong năm 2009, khu vực DNNN chiếm không dưới 60% trong tổng tín dụng nợ nội địa tăng thêm của toàn nền kinh tế”.  Phần tô đậm là phần tôi không hiểu nổi.  “Tổng tín dụng nợ nội địa” là gì?  Chắc chắn phải có một cách viết để thường dân có thể hiểu, chứ đâu cần đến cái cụm từ dài như thế.  Ngoài ra, mới nói ở phía trên rằng trong năm 2009 nợ của các doanh nghiệp Nhà nước chiếm 54.2% tổng GDP, vậy mà đoạn này nói rằng “không dưới 60% tổng tín dụng nội địa tăng thêm của toàn nền kinh tế”.  Mẫu số của 60% là cái gì?
Nói tóm lại, một bài báo ngắn có nhiều ảnh hưởng, nhưng thông tin thì quá mù mờ.  Mù mờ là do cách trình bày và cách dùng những thuật ngữ kinh tế làm cho thông tin càng thêm khó hiểu.  Tuy nhiên, nói gì thì nói, Việt Nam nợ quá nhiều.  Chỉ riêng doanh nghiệp của Nhà nước mà đã nợ gần 45 tỉ USD, chưa biết doanh nghiệp tư nhân nợ bao nhiêu.  Điều đáng chú ý hay quan tâm hơn là chỉ trong vòng 12 tháng mà số nợ của DNNN tăng hơn 2 lần.  Có thể xem đó là khủng hoảng?

====

Cảnh báo nợ của doanh nghiệp nhà nước

Vũ Thành Tự Anh (*)
Thứ Tư,  9/3/2011, 22:36 (GMT+7)

(TBKTSG) - Theo báo cáo của Ủy ban Thường vụ Quốc hội, tính đến 31-12-2008, tổng dư nợ nội địa của các tập đoàn, tổng công ty nhà nước là 287.000 tỉ đồng. Nếu tính cả nợ nước ngoài thì đến cuối 2008, tổng nợ của khu vực doanh nghiệp nhà nước (DNNN) xấp xỉ 23,9% GDP.
Trong năm 2009, theo báo cáo của Chính phủ gửi Quốc hội ngày 1-11-2010 thì nợ của 81/91 tập đoàn, tổng công ty nhà nước (chưa tính Vinashin) là 813.435 tỉ đồng, tương đương với 49% GDP. Nếu tính cả nợ của Vinashin, theo báo cáo của Bộ Tài chính là 86.000 tỉ, thì nợ của khu vực DNNN đến cuối năm 2009 (không kể chín tập đoàn, tổng công ty chưa có số liệu) đã lên tới 54,2% GDP năm 2009.
Rõ ràng là nợ của cả DNNN và Chính phủ đều tăng rất nhanh trong một thời gian rất ngắn, trong đó mức tăng nợ của khu vực DNNN thật sự đáng lo ngại.
Nếu nhìn vào con số tuyệt đối, sau khi trừ đi các khoản nợ nước ngoài và với những tính toán thận trọng nhất thì trong năm 2009, khu vực DNNN chiếm không dưới 60% trong tổng tín dụng nợ nội địa tăng thêm của toàn nền kinh tế. Đây là bằng chứng cho thấy các DNNN là đối tượng được hưởng lợi nhiều nhất từ chương trình hỗ trợ lãi suất và kích cầu của Chính phủ năm 2009.
Việc nợ của DNNN và nợ của Chính phủ đang ở mức khá cao, đồng thời tăng rất nhanh đòi hỏi phải sớm có những biện pháp quản lý nợ công hiệu quả.
Nội dung quan trọng nhất trong quản lý nợ công là quản lý rủi ro. Đầu tiên là rủi ro thị trường - chủ yếu liên quan đến sự thăng giáng thất thường của thị trường. Với viễn cảnh phục hồi đầy bất trắc, cộng thêm sự lan tỏa khủng hoảng nợ trên thế giới, thị trường có thể không mặn mà với trái phiếu chính phủ, đặc biệt là đối với những quốc gia có mức tín nhiệm tín dụng thấp và triển vọng tiêu cực. Phương pháp chủ yếu để hạn chế rủi ro thị trường là đảm bảo sự linh hoạt về thời điểm, cấu trúc, và các điều khoản của việc phát hành nợ.
Thứ hai là rủi ro lãi suất. Rủi ro này chủ yếu xảy ra đối với các khoản nợ có lãi suất thả nổi hoặc không được phòng vệ. Vì tỷ lệ nợ chính phủ với lãi suất thả nổi của Việt Nam còn thấp nên rủi ro lãi suất không phải là điều lo ngại trước mắt. Tuy nhiên, vì Việt Nam đã trở thành một nước thu nhập trung bình nên tỷ trọng các khoản vay thương mại sẽ tăng. Vì lãi suất thương mại thường cao và biến động mạnh hơn lãi suất ưu đãi nên trước khi phát hành nợ, Chính phủ và các doanh nghiệp sẽ ngày càng phải cân nhắc nhiều hơn tới rủi ro lãi suất.
Thứ ba là rủi ro về dòng tiền. Cho đến nay, nợ ngắn hạn chiếm chưa tới 15% trong tổng nợ chính phủ của Việt Nam. Tuy nhiên, việc tỷ lệ nợ ngắn hạn trên dự trữ ngoại tệ đang tăng lên sẽ đòi hỏi Bộ Tài chính phải hết sức thận trọng trong hoạt động quản lý nợ của mình.
Thứ tư là rủi ro về tỷ giá. Hiện nay khoảng một phần ba nợ chính phủ của Việt Nam là bằng đồng yen, vì vậy nếu đồng yen vẫn tiếp tục xu thế lên giá như hiện nay thì gánh nặng nợ nần cũng gia tăng theo. Tương tự như vậy, với sức ép của Mỹ và EU, xu thế đồng nhân dân tệ tăng giá là khó tránh khỏi. Trong khi đó, tín dụng thương mại bằng nhân dân tệ, đặc biệt là trong các dự án cơ sở hạ tầng và công nghiệp nặng ở Việt Nam đang tăng lên một cách nhanh chóng. Chính phủ cũng như doanh nghiệp vì vậy cần rất thận trọng khi đi vay bằng nhân dân tệ.
Cuối cùng, rủi ro lớn nhất có lẽ nằm ở hoạt động... quản lý rủi ro nợ công! Cho đến nay, từ Bộ Tài chính cho đến các DNNN đều chưa coi trọng đúng mức việc phân tích, đánh giá, và có biện pháp hiệu quả nhằm hạn chế rủi ro khi phát hành nợ.
Cần lưu ý rằng vì nợ của DNNN và nợ của Chính phủ có tính chất và cấu trúc khác nhau nên cần có những biện pháp quản lý rủi ro thích hợp. Tuy nhiên, dù nợ ở cấp độ nào thì cũng phải tuân thủ một số nguyên lý cơ bản: không nên chấp nhận rủi ro khi không có biện pháp hữu hiệu để thấu hiểu và quản lý nó; không nên chấp nhận một mức độ rủi ro vượt quá một ngưỡng an toàn; và không nên chấp nhận rủi ro nếu không có một sự đền bù thỏa đáng.
Khi bỏ qua những nguyên lý hết sức giản dị nhưng cơ bản này, một doanh nghiệp có thể rơi vào tình trạng khó khăn, thậm chí mất khả năng trả nợ, từ đó ảnh hưởng tiêu cực đến các doanh nghiệp khác cũng như toàn bộ nền kinh tế. Trường hợp Vinashin mới đây là một ví dụ điển hình. Tương tự như vậy, một nền kinh tế cần có chiến lược quản lý rủi ro nợ tốt để tránh đưa đất nước rơi vào gánh nặng nợ nần.
___________________________________
(*) Chương trình Giảng dạy kinh tế Fulbright

Thứ Năm, 17 tháng 2, 2011

Tài Sản Và Tiêu Sản

Giàu có được tính bằng của cải, bằng tài sản chẳng hạn như cái nhà, miếng đất, cửa tiệm, số vàng cây, cổ phiếu, tiền mặt mà bạn đang làm chủ chứ không tính bằng những vật dụng tiêu dùng hằng ngày như chiếc xe hơi đời mới hay cái Plasma TV 70 inch. Tài sản được tính bằng “net worth”, giá trị thật, chứ không phải là những vật dụng xa hoa mà bạn đang phải nai lưng đi “cày” để trả góp. Xa hơn nữa, tài sản là của cải có khả năng đem đến thêm cho chủ nhân của nó những lợi nhuận khác. “Tài” là “tiền”, “sản” là “sanh sản”, hay là “đẻ.” Vậy tài sản là của cải tự nó có khả năng đẻ ra tiền cho chủ nhân của nó, còn như của cải mà không có khả năng đẻ ra tiền cho chủ nhân của nó thì được gọi là “tiêu sản.”

Tài sản và tiêu sản
Khi bạn đi làm có được đồng lương bạn chỉ có ba cách để giải quyết đồng tiền của bạn, một là xài, hai là để dành, và ba là đầu tư.

Giải pháp thứ nhất-Xài tiền ngay hôm nay
Khi bạn xài đồng tiền của bạn ngày hôm nay, bạn không còn tiền phòng thân khi bất trắc, chẳng hạn như cái lốp xe bị nổ, hay là bạn ngã bệnh không đi làm được vài hôm. Cho nên dù muốn dù không gì, bạn cũng phải để dành một số tiền nào đó để phòng khi trái gió trở trời. Và đồng tiền bạn xài ngày hôm nay đã bị mất, nó không còn giá trị đẽ ra tiền cho bạn nữa đó là “tiêu sản.”

Giải pháp thứ hai-để dành
Khi bạn không thể xài hết tiền của bạn vì bạn phải để dành phòng xa. Đồng tiền của bạn là cứ giữ nó trong túi, hay là trong safe-box thì càng tốt. Nhưng rồi đến khi bạn lấy cái đồng bạc ấy ra để dùng thì bạn mới thấy rằng đồng tiền của bạn không còn giá trị của đồng bạc của hôm bạn cất nữa. Sự thật rành rành trước mắt đấy, mới hồi năm ngoái thôi, tôi trả $30 để đổ đầy bình xăng, vậy mà hôm nay tôi cũng trả $30 đồng tiền xăng, nhưng mà bình xăng của tôi chỉ có hơn ¾ một chút thôi. Bởi thế, tiền để trong safe-box cũng được gọi là “tiêu sản.”

Giải pháp thứ ba-đầu tư
Có nhiều người cho rằng đầu tư có quá nhiều rủi ro, và cũng quá liều lĩnh. Nhưng thật sự không đầu tư mới là việc làm liều lĩnh, bởi vì bạn biết rỏ rằng đồng tiền của bạn sẽ bị mất giá mà bạn không làm gì để ngăn cản việc đó xảy ra. Đầu tư thật sự là có rủi ro, cho nên bạn cần học hỏi, tìm hiểu những rủi ro ấy, và đồng thời kiếm biện pháp để giảm thiểu rủi ro trong đầu tư. Chúng ta sẽ tìm hiểu về rủi ro trong đầu tư vào dịp khác nhưng ở đây tôi muốn nhấn mạnh với bạn rằng giá trị của đồng tiền bạn đang có ngày hôm nay, lúc nào cũng giá trị hơn là đồng tiền đó trong tương lai. Đầu tư kiếm lời để bạn có thể nâng cao số bạn có ngày hôm nay bù vào sự lạm phát trong thị trường. Hơn thế nữa, bạn còn có thể kiếm nhiều hơn là sự lạm phát mà sinh lợi cho bạn đó chính là “tài sản.”

Giá trị hiện tại và giá trị tương lai

Tôi xin lấy một thí dụ điển hình: Tôi mua Certificate of Deposit (CD) $1000 và ngân hàng hứa sẽ trả cho tôi 10% tiền lời hằng năm cho 5 năm.

Cuối năm đầu tiên, tôi có thể kiếm được tiền lời là $100, cuối năm thứ 2 tôi kiếm được $110 tiền lời. $10 tiền lời nhiều hơn so với năm thứ nhất bởi vì 10% của $100 tiền lời của năm đầu tiên đã sanh lợi cho tôi thêm $10 nữa. Cứ thế mà đi lên. Công thức để tính tiền lời cho lãi kép là FV=PV(1+i)n
Cái công thức này xin được giải thích như sau:
FV = Giá trị tương lai
PV = Giá trị hiện tại
i = Lãi suất hằng năm
n = thời hạn đầu tư

Thí dụ: Bạn sẽ thu được bao nhiều tiền nếu bạn mua $30,000 công trái với lãi suất là 9% cho thời hạn là 15 năm.

FV= $30000(1+0.09)15 = $109,247.47
Tiền mà bạn sẽ thu về là $109,247.47

Ngoài cái công thức ở trên ra, bạn còn có một công thức tính nhẩm khác để biết được bao nhiêu lâu thì tiền của bạn lên gấp đôi đó là công thức 72. Cứ lấy số 72 chia cho phân lời hằng năm của mục đầu tư thì bạn sẽ biết được bao lâu tiền của bạn lên gấp đôi. Thí dụ: tiền lời hằng năm của S&P 500 là 12%. 72 chia cho 12 bằng 6. Vậy cứ 6 năm thì tiền của bạn lên gấp đôi. Vậy nếu như bạn đầu tư vào S&P 500 với số tiền $10,000 cho 30 năm. Tiền của bạn được tăng gấp đôi 6 năm một lần, như vậy tiền của bạn sẽ là: $20,000…. $40,000….. $80,000…… $160,000…… và $320,000.

Đầu tư như thế nào? Đầu tư ra sao? Đầu tư vào đâu? Có lẽ cũng là những thắc mắc trong đầu của bạn bây giờ. Lần lược chúng tôi sẽ giải thích những mối đầu tư khác nhau trong trang web này.

Nhưng việc làm thêm để kiếm tiền không phải là cách để làm giàu. Làm được nhiều tiền rồi mua xe, mua nhà cũng không phải là cách để làm giàu. Làm giàu là làm sao cho của cải của bạn tự nó có thể kiếm ra tiền để nuôi bạn, phục vụ cho cuộc sống vật chất cho gia đình, chòm xóm, cộng đồng, và đất nước của bạn. Tài sản là tự nó phát tài, còn nếu như nó không phát tài thì bạn liệt kê nó vào sổ “vô sản”, “diệt sản” hay “tiêu sản” và điều đó đừng đến với bạn trong lúc này.
Sưu tầm