Zabbix custom LLD to obtain passenger performance counters - passenger

I have written a python script to parse the passenger-status output while I need to setup LLD for the number of process that passenger is running.
[root#ip-10-1-1-1 cronjob]# ./passenger_status.py discovery trapper
- passenger.threads.discovery {"data": [{"{#THREADNO}":"1"},{"{#THREADNO}":"2"},{"{#THREADNO}":"3"},{"{#THREADNO}":"4"},{"{#THREADNO}":"5"},{"{#THREADNO}":"6"},{"{#THREADNO}":"7"},{"{#THREADNO}":"8"}]}
Then I have tried to send the discover to zabbix server using zabbix trapper as:-
#!/bin/bash
export HOME=/usr/cronjob
tmpFile=`/bin/mktemp`
$HOME/passenger_status.py discovery trapper > ${tmpFile}
/usr/bin/zabbix_sender -vv -c /etc/zabbix/zabbix_agentd.conf -i ${tmpFile}
rm ${tmpFile}
And then I setup a discovery rule
When I run the command, it success:-
[root#ip-10-1-1-1 cronjob]# ./passenger_discovery.sh
zabbix_sender [12836]: DEBUG: answer [{
"response":"success",
"info":"processed: 1; failed: 0; total: 1; seconds spent: 0.010336"}]
info from server: "processed: 1; failed: 0; total: 1; seconds spent: 0.010336"
sent: 1; skipped: 0; total: 1
Then I assume everything is OK, and then I setup some testing key.
And then I tried to send the server some data for testing.
[root#ip-10-1-1-1 cronjob]# ./passenger_status.sh
zabbix_sender [13041]: DEBUG: answer [{
"response":"success",
"info":"processed: 0; failed: 250; total: 250; seconds spent: 0.002045"}]
info from server: "processed: 0; failed: 250; total: 250; seconds spent: 0.002045"
zabbix_sender [13042]: DEBUG: answer [{
"response":"success",
"info":"processed: 0; failed: 46; total: 46; seconds spent: 0.000431"}]
info from server: "processed: 0; failed: 46; total: 46; seconds spent: 0.000431"
sent: 296; skipped: 0; total: 296
It simply tell me that no key were being accepted.
For debug purpose, I dumped the server log below when I send the discovery trapper:-
3345:20170116:195020.919 trapper #8 [processing data]
3345:20170116:195020.919 trapper got '{
"request":"sender data",
"data":[
{
"host":"ec2-59-56-61-222.ap-northeast-1.compute.amazonaws.com",
"key":"passenger.threads.discovery",
"value":"{\"data\": [{\"{#THREADNO}\":\"1\"},{\"{#THREADNO}\":\"2\"},{\"{#THREADNO}\":\"3\"},{\"{#THREADNO}\":\"4\"},{\"{#THREADNO}\":\"5\"},{\"{#THREADNO}\":\"6\"},{\"{#THREADNO}\":\"7\"},{\"{#THREADNO}\":\"8\"}]}"}]}'
3345:20170116:195020.919 In recv_agenthistory()
3345:20170116:195020.919 In process_hist_data()
3345:20170116:195020.919 In process_mass_data()
3345:20170116:195020.919 In substitute_simple_macros() data:EMPTY
3345:20170116:195020.919 In lld_process_discovery_rule() itemid:30048
3345:20170116:195020.919 query [txnlev:0] [select hostid,key_,state,filter,error,lifetime from items where itemid=30048]
3345:20170116:195020.920 In substitute_simple_macros() data:'30'
3345:20170116:195020.920 In lld_rows_get()
3345:20170116:195020.920 lld_rows_get() f_macro:'{#THREADNO}' f_regexp:'# The no. of threads that the passenger generated'
3345:20170116:195020.920 In lld_check_record() jp_row:'{"{#THREADNO}":"1"}'
3345:20170116:195020.920 End of lld_check_record():FAIL
3345:20170116:195020.920 In lld_check_record() jp_row:'{"{#THREADNO}":"2"}'
3345:20170116:195020.920 End of lld_check_record():FAIL
3345:20170116:195020.920 In lld_check_record() jp_row:'{"{#THREADNO}":"3"}'
3345:20170116:195020.920 End of lld_check_record():FAIL
3345:20170116:195020.920 In lld_check_record() jp_row:'{"{#THREADNO}":"4"}'
3345:20170116:195020.920 End of lld_check_record():FAIL
3345:20170116:195020.920 In lld_check_record() jp_row:'{"{#THREADNO}":"5"}'
3345:20170116:195020.920 End of lld_check_record():FAIL
3345:20170116:195020.920 In lld_check_record() jp_row:'{"{#THREADNO}":"6"}'
3345:20170116:195020.920 End of lld_check_record():FAIL
3345:20170116:195020.920 In lld_check_record() jp_row:'{"{#THREADNO}":"7"}'
3345:20170116:195020.920 End of lld_check_record():FAIL
3345:20170116:195020.920 In lld_check_record() jp_row:'{"{#THREADNO}":"8"}'
3345:20170116:195020.920 End of lld_check_record():FAIL
3345:20170116:195020.920 End of lld_rows_get():SUCCEED
3345:20170116:195020.920 In lld_update_items()
3345:20170116:195020.920 query [txnlev:0] [select i.itemid,i.name,i.key_,i.type,i.value_type,i.data_type,i.delay,i.delay_flex,i.history,i.trends,i.status,i.trapper_hosts,i.units,i.multiplier,i.delta,i.formula,i.logtimefmt,i.valuemapid,i.params,i.ipmi_sensor,i.snmp_community,i.snmp_oid,i.port,i.snmpv3_securityname,i.snmpv3_securitylevel,i.snmpv3_authprotocol,i.snmpv3_authpassphrase,i.snmpv3_privprotocol,i.snmpv3_privpassphrase,i.authtype,i.username,i.password,i.publickey,i.privatekey,i.description,i.interfaceid,i.snmpv3_contextname from items i,item_discovery id where i.itemid=id.itemid and id.parent_itemid=30048]
3345:20170116:195020.921 In lld_items_get()
3345:20170116:195020.921 query [txnlev:0] [select id.itemid,id.key_,id.lastcheck,id.ts_delete,i.name,i.key_,i.type,i.value_type,i.data_type,i.delay,i.delay_flex,i.history,i.trends,i.trapper_hosts,i.units,i.multiplier,i.delta,i.formula,i.logtimefmt,i.valuemapid,i.params,i.ipmi_sensor,i.snmp_community,i.snmp_oid,i.port,i.snmpv3_securityname,i.snmpv3_securitylevel,i.snmpv3_authprotocol,i.snmpv3_authpassphrase,i.snmpv3_privprotocol,i.snmpv3_privpassphrase,i.authtype,i.username,i.password,i.publickey,i.privatekey,i.description,i.interfaceid,i.snmpv3_contextname from item_discovery id join items i on id.itemid=i.itemid where id.parent_itemid=30049]
3345:20170116:195020.922 End of lld_items_get()
3345:20170116:195020.922 In lld_items_validate()
3345:20170116:195020.922 End of lld_items_validate()
3345:20170116:195020.922 In lld_applications_make()
3345:20170116:195020.922 In lld_applications_get()
3345:20170116:195020.922 query [txnlev:0] [select applicationid from items_applications where itemid=30049]
3345:20170116:195020.922 End of lld_applications_get() values_num:0
3345:20170116:195020.922 End of lld_applications_make()
3345:20170116:195020.922 In lld_items_save()
3345:20170116:195020.922 End of lld_items_save()
3345:20170116:195020.922 In lld_items_get()
3345:20170116:195020.923 query [txnlev:0] [select id.itemid,id.key_,id.lastcheck,id.ts_delete,i.name,i.key_,i.type,i.value_type,i.data_type,i.delay,i.delay_flex,i.history,i.trends,i.trapper_hosts,i.units,i.multiplier,i.delta,i.formula,i.logtimefmt,i.valuemapid,i.params,i.ipmi_sensor,i.snmp_community,i.snmp_oid,i.port,i.snmpv3_securityname,i.snmpv3_securitylevel,i.snmpv3_authprotocol,i.snmpv3_authpassphrase,i.snmpv3_privprotocol,i.snmpv3_privpassphrase,i.authtype,i.username,i.password,i.publickey,i.privatekey,i.description,i.interfaceid,i.snmpv3_contextname from item_discovery id join items i on id.itemid=i.itemid where id.parent_itemid=30050]
3345:20170116:195020.923 End of lld_items_get()
3345:20170116:195020.923 In lld_items_validate()
3345:20170116:195020.923 End of lld_items_validate()
3345:20170116:195020.923 In lld_applications_make()
3345:20170116:195020.923 In lld_applications_get()
3345:20170116:195020.923 query [txnlev:0] [select applicationid from items_applications where itemid=30050]
3345:20170116:195020.923 End of lld_applications_get() values_num:0
3345:20170116:195020.923 End of lld_applications_make()
3345:20170116:195020.923 In lld_items_save()
3345:20170116:195020.923 End of lld_items_save()
3345:20170116:195020.923 In lld_items_get()
3345:20170116:195020.923 query [txnlev:0] [select id.itemid,id.key_,id.lastcheck,id.ts_delete,i.name,i.key_,i.type,i.value_type,i.data_type,i.delay,i.delay_flex,i.history,i.trends,i.trapper_hosts,i.units,i.multiplier,i.delta,i.formula,i.logtimefmt,i.valuemapid,i.params,i.ipmi_sensor,i.snmp_community,i.snmp_oid,i.port,i.snmpv3_securityname,i.snmpv3_securitylevel,i.snmpv3_authprotocol,i.snmpv3_authpassphrase,i.snmpv3_privprotocol,i.snmpv3_privpassphrase,i.authtype,i.username,i.password,i.publickey,i.privatekey,i.description,i.interfaceid,i.snmpv3_contextname from item_discovery id join items i on id.itemid=i.itemid where id.parent_itemid=30052]
3345:20170116:195020.924 End of lld_items_get()
3345:20170116:195020.924 In lld_items_validate()
3345:20170116:195020.924 End of lld_items_validate()
3345:20170116:195020.924 In lld_applications_make()
3345:20170116:195020.924 In lld_applications_get()
3345:20170116:195020.924 query [txnlev:0] [select applicationid from items_applications where itemid=30052]
3345:20170116:195020.924 End of lld_applications_get() values_num:0
3345:20170116:195020.924 End of lld_applications_make()
3345:20170116:195020.924 In lld_items_save()
3345:20170116:195020.924 End of lld_items_save()
3345:20170116:195020.924 End of lld_update_items()
3345:20170116:195020.924 In lld_update_triggers()
3345:20170116:195020.924 query [txnlev:0] [select distinct t.triggerid,t.description,t.expression,t.status,t.type,t.priority,t.comments,t.url from triggers t,functions f,items i,item_discovery id where t.triggerid=f.triggerid and f.itemid=i.itemid and i.itemid=id.itemid and id.parent_itemid=30048]
3345:20170116:195020.926 End of lld_update_triggers()
3345:20170116:195020.926 In lld_update_graphs()
3345:20170116:195020.926 query [txnlev:0] [select distinct g.graphid,g.name,g.width,g.height,g.yaxismin,g.yaxismax,g.show_work_period,g.show_triggers,g.graphtype,g.show_legend,g.show_3d,g.percent_left,g.percent_right,g.ymin_type,g.ymin_itemid,g.ymax_type,g.ymax_itemid from graphs g,graphs_items gi,items i,item_discovery id where g.graphid=gi.graphid and gi.itemid=i.itemid and i.itemid=id.itemid and id.parent_itemid=30048]
3345:20170116:195020.928 End of lld_update_graphs()
3345:20170116:195020.928 In lld_update_hosts()
3345:20170116:195020.928 query [txnlev:0] [select h.proxy_hostid,h.ipmi_authtype,h.ipmi_privilege,h.ipmi_username,h.ipmi_password from hosts h,items i where h.hostid=i.hostid and i.itemid=30048]
3345:20170116:195020.928 query [txnlev:0] [select hi.interfaceid,hi.type,hi.main,hi.useip,hi.ip,hi.dns,hi.port from interface hi,items i where hi.hostid=i.hostid and i.itemid=30048]
3345:20170116:195020.929 In lld_hostmacros_get()
3345:20170116:195020.929 query [txnlev:0] [select hm.macro,hm.value from hostmacro hm,items i where hm.hostid=i.hostid and i.itemid=30048]
3345:20170116:195020.929 End of lld_hostmacros_get()
3345:20170116:195020.929 query [txnlev:0] [select h.hostid,h.host,h.name,h.status,hi.inventory_mode from hosts h,host_discovery hd left join host_inventory hi on hd.hostid=hi.hostid where h.hostid=hd.hostid and hd.parent_itemid=30048]
3345:20170116:195020.930 End of lld_update_hosts()
3345:20170116:195020.930 End of lld_process_discovery_rule()
3345:20170116:195020.930 End of process_mass_data()
3345:20170116:195020.930 End of process_hist_data():SUCCEED
3345:20170116:195020.930 In zbx_send_response()
3345:20170116:195020.930 zbx_send_response() '{
"response":"success",
"info":"processed: 1; failed: 0; total: 1; seconds spent: 0.010795"}'
3345:20170116:195020.930 End of zbx_send_response():SUCCEED
3345:20170116:195020.930 End of recv_agenthistory()
3345:20170116:195020.930 trapper #8 [processed data in 0.011424 sec, waiting for connection]
I tells me failed but didn't say any reason? I also dumped the server log during the trapper data send below:-
3338:20170116:195647.884 trapper #1 [processing data]
3338:20170116:195647.885 trapper got '{
"request":"sender data",
"data":[
{
"host":"ec2-59-56-61-222.ap-northeast-1.compute.amazonaws.com",
"key":"passenger.threads[8,total_requests_begun]",
"value":"124"},
{
"host":"ec2-59-56-61-222.ap-northeast-1.compute.amazonaws.com",
"key":"passenger.threads[7,total_requests_begun]",
"value":"124"},
{
"host":"ec2-59-56-61-222.ap-northeast-1.compute.amazonaws.com",
"key":"passenger.threads[6,total_requests_begun]",
"value":"124"},
{
"host":"ec2-59-56-61-222.ap-northeast-1.compute.amazonaws.com",
"key":"passenger.threads[5,total_requests_begun]",
"value":"124"},
{
"host":"ec2-59-56-61-222.ap-northeast-1.compute.amazonaws.com",
"key":"passenger.threads[4,total_requests_begun]",
"value":"124"},
{
"host":"ec2-59-56-61-222.ap-northeast-1.compute.amazonaws.com",
"key":"passenger.threads[3,total_requests_begun]",
"value":"124"},
{
"host":"ec2-59-56-61-222.ap-northeast-1.compute.amazonaws.com",
"key":"passenger.threads[2,total_requests_begun]",
"value":"124"}]}'
3338:20170116:195647.885 In recv_agenthistory()
3338:20170116:195647.885 In process_hist_data()
3338:20170116:195647.887 In process_mass_data()
3338:20170116:195647.887 End of process_mass_data()
3338:20170116:195647.887 End of process_hist_data():SUCCEED
3338:20170116:195647.887 In zbx_send_response()
3338:20170116:195647.887 zbx_send_response() '{
"response":"success",
"info":"processed: 0; failed: 250; total: 250; seconds spent: 0.002063"}'
3338:20170116:195647.888 End of zbx_send_response():SUCCEED
3338:20170116:195647.888 End of recv_agenthistory()
3338:20170116:195647.888 trapper #1 [processed data in 0.003354 sec, waiting for connection]
3346:20170116:195647.889 trapper #9 [processing data]
3346:20170116:195647.889 trapper got '{
"request":"sender data",
"data":[
{
"host":"ec2-59-56-61-222.ap-northeast-1.compute.amazonaws.com",
"key":"passenger.threads[1,total_requests_begun]",
"value":"124"}]}'
3346:20170116:195647.889 In recv_agenthistory()
3346:20170116:195647.889 In process_hist_data()
3346:20170116:195647.890 In process_mass_data()
3346:20170116:195647.890 End of process_mass_data()
3346:20170116:195647.890 End of process_hist_data():SUCCEED
3346:20170116:195647.890 In zbx_send_response()
3346:20170116:195647.890 zbx_send_response() '{
"response":"success",
"info":"processed: 0; failed: 46; total: 46; seconds spent: 0.000419"}'
3346:20170116:195647.890 End of zbx_send_response():SUCCEED
3346:20170116:195647.890 End of recv_agenthistory()
3346:20170116:195647.890 trapper #9 [processed data in 0.000970 sec, waiting for connection]
Then I read from the internet that discovery won't work with sender? Is that true? But anyway, I also performed some changes which is to include the discovery inside the UserParam to be monitored with zabbix_agent but it didn't work as well.
Here comes a list of testing item prototypes:-
But I have saw from the internet that there are a lot of successful case with custom LLD, what have I done wrong? The zabbix version that I am using is 2.2.8, would that be a possible cause?
#Richlv is correct, finally I removed the macro and regex and it did work now.
and BTW I have make some other changes, bcoz the way how zabbix works.... coz some of the reading for some thread result in None.... (bcoz I parse using python) and zabbix got this and rejected the same key for all other thread even though they are valid no..... I have modified the python script so that it will return a 0 in case the setting is None in python. Now it works. Thx very much for everyone's help. Although I am not fully understand why, while the key is filter and regex got to be empty.

Related

Is it possible for unit test cases for Spring boot data jpa #Query native queries?

I have a spring boot application with JPA configured. While querying the database i am running native sql query with the help of spring data #query annotation. Now i am planning to write test cases using spring boot test framework. Is it possible to write tests or not?
Code:
String searchQuery = "SELECT dh1.* FROM device_hist AS dh1 JOIN (" +
"SELECT rank() OVER (PARTITION BY dh.device_nm, dh.lst_log_in_user_id ORDER BY lst_chkin_ts DESC), " +
"dh.device_nm, dh.lst_log_in_user_id, dh.lst_chkin_ts FROM device_hist dh) AS T ON dh1.device_nm = T.device_nm " +
"AND dh1.lst_log_in_user_id = T.lst_log_in_user_id AND dh1.lst_chkin_ts = T.lst_chkin_ts WHERE T.rank = 1 AND " +
"dh1.lst_chkin_ts >= :lst_chkin_ts ";
String searchCountQuery = "SELECT count(*) FROM device_hist AS dh1 JOIN (" +
"SELECT rank() OVER (PARTITION BY dh.device_nm, dh.lst_log_in_user_id ORDER BY lst_chkin_ts DESC), " +
"dh.device_nm, dh.lst_log_in_user_id, dh.lst_chkin_ts FROM device_hist dh) AS T on h1.device_nm = T.device_nm " +
"AND dh1.lst_log_in_user_id = T.lst_log_in_user_id AND dh1.lst_chkin_ts = T.lst_chkin_ts WHERE T.rank = 1 " +
"AND dh1.lst_chkin_ts >= :lst_chkin_ts ";
#Query(value = searchQuery + "ORDER BY dh1.device_nm, dh1.lst_chkin_ts DESC",
countQuery = searchCountQuery,
nativeQuery = true)
Page<DeviceHistory> findAllLatestDeviceHistoryBylastCheckInTimeStamp(
#Param("lst_chkin_ts") Date lastCheckInTimeStamp, Pageable pageable);
Testcase:
#Test
void testfindAllLatestDeviceHistoryBylastCheckInTimeStamp() {
LocalDate localDateTime = LocalDate.now();
ZoneId defaultZoneId = ZoneId.systemDefault();
Instant instant = localDateTime.minusDays(10).atStartOfDay(defaultZoneId).toInstant();
Date timeStamp = Date.from(instant);
Page<DeviceHistory> devices = deviceHistoryRepository.findAllLatestDeviceHistoryBylastCheckInTimeStamp(timeStamp, pageable);
assertNotNull(devices.getContent());
}
Error:
could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet
org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:281)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:255)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:528)
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)
at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:153)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:149)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
at com.sun.proxy.$Proxy138.findAllLatestDeviceHistoryBylastCheckInTimeStamp(Unknown Source)
at com.aexp.de.crypto.wde.server.repository.DeviceHistoryRepositoryTest.testfindAllLatestDeviceHistoryBylastCheckInTimeStamp(DeviceHistoryRepositoryTest.java:158)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:675)
at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
...
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:366)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:99)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139)
... 96 more
Caused by: org.postgresql.util.PSQLException: ERROR: missing FROM-clause entry for table "h1"
I think you have a problem in
String searchCountQuery
Exception told you that you have problem with something called h1 table
ERROR: missing FROM-clause entry for table "h1"
As far as I can see this string contains h1:
"dh.device_nm, dh.lst_log_in_user_id, dh.lst_chkin_ts FROM device_hist dh) AS T on h1.device_nm = T.device_nm ". (should be dh1 I guess)
Usually if you are facing SQLGrammarException: could not extract ResultSet then its probably a problem with your SQL. Also the rest of a stack trace usally helps to clarify the issue.

Using IF statement in Oracle SQL

I'm trying to use an IF ELSE statement in a sql query because I want to sum the units per district based on their package size per each PLN #. Can I do this? Here is my attempt, which does not work:
SELECT district_nbr,PLN_NBR, SUM(A.LO_IOH_UNITS) AS TOTAL_UNITS, SUM (A.LO_IOH_EXT_COST_DLRS) AS TOTAL_DOLLARS
FROM FCT_LOIOH_DAY_STR_PLN A, DIM_PROD_PLN B, DIM_LOCATION C
WHERE B.PLN_NBR IN(40000683181, 40000418723, 40000335776)
AND A.PROD_ID = B.PROD_ID
AND A.LOC_ID = C.LOC_ID
if PLN_NBR = '40000683181' then SUM(A.LO_IOH_UNITS)/25
else SUM(A.LO_IOH_UNITS)/60
GROUP BY district_nbr,PLN_NBR
SELECT district_nbr, PLN_NBR,
SUM(A.LO_IOH_UNITS) / (case when PLN_NBR = 40000683181 then 25 else 60 end) AS TOTAL_UNITS,
SUM (A.LO_IOH_EXT_COST_DLRS) AS TOTAL_DOLLARS
FROM FCT_LOIOH_DAY_STR_PLN A,
DIM_PROD_PLN B,
DIM_LOCATION C
WHERE B.PLN_NBR IN (40000683181, 40000418723, 40000335776)
AND A.PROD_ID = B.PROD_ID
AND A.LOC_ID = C.LOC_ID
GROUP BY district_nbr, PLN_NBR;
In Oracle SQL, you can use CASE WHEN ... ELSE for conditionals:
CASE WHEN PLN_NBR = '40000683181' THEN SUM(A.LO_IOH_UNITS) / 25
ELSE SUM)A.LO_IOH_UNITS) / 60
END
Such CASE WHEN ... statements go to the part where the other selected columns go:
SELECT
foo,
bar,
CASE ....
FROM
...

left join do not show all records

In following code left join do not show all the records from left !!!
select *,CASE WHEN (ResDEBIT> ResCREDIT) THEN (ResDEBIT) when (ResCREDIT> ResDEBIT)then (ResCREDIT) else 0 END AS Mande,CASE WHEN (ResDEBIT> ResCREDIT) THEN ('debit') when (ResCREDIT> ResDEBIT)then ('credit') ELSE ('ziro') END AS Status from(SELECT Sales.CustomerInfo.CustomerInfoID,FullTitle=(cast(Sales.CustomerInfo.AccountFK as nvarchar)+' - '+Sales.CustomerInfo.FullName), Sales.CustomerInfo.TopicFK, Sales.CustomerInfo.AccountFK,Sales.CustomerInfo.CompanyRegNo,Sales.CustomerInfo.PersonTypeFK,Sales.CustomerInfo.BankAccountDetail,Sales.CustomerInfo.BankAccountNo, Sales.CustomerInfo.AccountNo, Sales.CustomerInfo.FullName,
Sales.CustomerInfo.Birthdate, Sales.CustomerInfo.TitleFK, Sales.CustomerInfo.RegistrationDate, Sales.CustomerInfo.CustomerPhotoFK, Sales.CustomerInfo.SocialNo,
Sales.CustomerInfo.WebPage, Sales.CustomerInfo.JobFK, Sales.CustomerInfo.MaxDebitLimit, Sales.CustomerInfo.MaxChequeCredit,
Sales.CustomerInfo.PreferedPaymentMethodFK, Sales.CustomerInfo.FirstBalanceKind, Sales.CustomerInfo.FirstBalance, Sales.CustomerInfo.Debit,
Sales.CustomerInfo.Credit, Sales.CustomerInfo.Note, Sales.CustomerInfo.FinancialPeriodFK, Sales.CustomerInfo.CompanyInfoFK,
isnull(SUM(Accounting.DocumentDetail.Debit),0) AS Debit1, isnull(SUM(Accounting.DocumentDetail.Credit),0) AS Credit1, (CASE WHEN (isnull(SUM(Accounting.DocumentDetail.Credit),0)
- isnull(SUM(Accounting.DocumentDetail.Debit),0)) < 0 THEN (isnull(SUM(Accounting.DocumentDetail.Debit),0) - isnull(SUM(Accounting.DocumentDetail.Credit),0)) ELSE 0 END) AS ResDEBIT,
(CASE WHEN (isnull(SUM(Accounting.DocumentDetail.Credit),0) - isnull(SUM(Accounting.DocumentDetail.Debit),0)) > 0 THEN (isnull(SUM(Accounting.DocumentDetail.Credit),0)
- isnull(SUM(Accounting.DocumentDetail.Debit),0)) ELSE 0 END) AS ResCREDIT,Sales.CustomerInfo.BlackListed, Sales.CustomerInfo.IsActive
FROM Sales.CustomerInfo left JOIN
Accounting.DocumentDetail ON Sales.CustomerInfo.AccountFK = Accounting.DocumentDetail.TopicFK
GROUP BY Sales.CustomerInfo.CustomerInfoID, Sales.CustomerInfo.TopicFK, Sales.CustomerInfo.AccountFK, Sales.CustomerInfo.AccountNo,
Sales.CustomerInfo.FullName, Sales.CustomerInfo.Birthdate, Sales.CustomerInfo.TitleFK,Sales.CustomerInfo.CompanyRegNo,Sales.CustomerInfo.PersonTypeFK,Sales.CustomerInfo.BankAccountDetail,Sales.CustomerInfo.BankAccountNo, Sales.CustomerInfo.RegistrationDate,
Sales.CustomerInfo.CustomerPhotoFK, Sales.CustomerInfo.SocialNo, Sales.CustomerInfo.WebPage, Sales.CustomerInfo.JobFK, Sales.CustomerInfo.MaxDebitLimit,
Sales.CustomerInfo.MaxChequeCredit, Sales.CustomerInfo.PreferedPaymentMethodFK, Sales.CustomerInfo.FirstBalanceKind, Sales.CustomerInfo.FirstBalance,
Sales.CustomerInfo.Debit, Sales.CustomerInfo.Credit, Sales.CustomerInfo.Note, Sales.CustomerInfo.FinancialPeriodFK, Sales.CustomerInfo.CompanyInfoFK,
Sales.CustomerInfo.BlackListed, Sales.CustomerInfo.IsActive) CustomerInfo
check how many distinct record exists for your group by columns
Select distinct
Sales.CustomerInfo.CustomerInfoID
,Sales.CustomerInfo.TopicFK
,Sales.CustomerInfo.AccountFK
,Sales.CustomerInfo.AccountNo
,Sales.CustomerInfo.FullName
,Sales.CustomerInfo.Birthdate
,Sales.CustomerInfo.TitleFK
,Sales.CustomerInfo.CompanyRegNo
,Sales.CustomerInfo.PersonTypeFK
,Sales.CustomerInfo.BankAccountDetail
,Sales.CustomerInfo.BankAccountNo
,Sales.CustomerInfo.RegistrationDate
,Sales.CustomerInfo.CustomerPhotoFK
,Sales.CustomerInfo.SocialNo
,Sales.CustomerInfo.WebPage
,Sales.CustomerInfo.JobFK
,Sales.CustomerInfo.MaxDebitLimit
,Sales.CustomerInfo.MaxChequeCredit
,Sales.CustomerInfo.PreferedPaymentMethodFK
,Sales.CustomerInfo.FirstBalanceKind
,Sales.CustomerInfo.FirstBalance
,Sales.CustomerInfo.Debit
,Sales.CustomerInfo.Credit
,Sales.CustomerInfo.Note
,Sales.CustomerInfo.FinancialPeriodFK
,Sales.CustomerInfo.CompanyInfoFK
,Sales.CustomerInfo.BlackListed
,Sales.CustomerInfo.IsActive
from Sales.CustomerInfo
the number of return records for your above query will be same...To get all records from your left table you can use any one of the below 2 methods but i would prefer the 2nd one
1)use sub query
2)first do your aggregation in a separate query and join it with your left table again... the query should be some thing similar to below code:
;WITH CTE ( AccountFK, Debit1 ,Credit1 ,ResDEBIT ,ResCREDIT )
AS (
SELECT
Sales.CustomerInfo.AccountFK
,isnull(SUM(Accounting.DocumentDetail.Debit), 0) AS Debit1
,isnull(SUM(Accounting.DocumentDetail.Credit), 0) AS Credit1
,(
CASE
WHEN (isnull(SUM(Accounting.DocumentDetail.Credit), 0) - isnull(SUM(Accounting.DocumentDetail.Debit), 0)) < 0
THEN (isnull(SUM(Accounting.DocumentDetail.Debit), 0) - isnull(SUM(Accounting.DocumentDetail.Credit), 0))
ELSE 0
END
) AS ResDEBIT
,(
CASE
WHEN (isnull(SUM(Accounting.DocumentDetail.Credit), 0) - isnull(SUM(Accounting.DocumentDetail.Debit), 0)) > 0
THEN (isnull(SUM(Accounting.DocumentDetail.Credit), 0) - isnull(SUM(Accounting.DocumentDetail.Debit), 0))
ELSE 0
END
) AS ResCREDIT
FROM Sales.CustomerInfo
LEFT JOIN Accounting.DocumentDetail ON Sales.CustomerInfo.AccountFK = Accounting.DocumentDetail.TopicFK
GROUP BY Sales.CustomerInfo.CustomerInfoID
,Sales.CustomerInfo.TopicFK
,Sales.CustomerInfo.AccountFK
,Sales.CustomerInfo.AccountNo
,Sales.CustomerInfo.FullName
,Sales.CustomerInfo.Birthdate
,Sales.CustomerInfo.TitleFK
,Sales.CustomerInfo.CompanyRegNo
,Sales.CustomerInfo.PersonTypeFK
,Sales.CustomerInfo.BankAccountDetail
,Sales.CustomerInfo.BankAccountNo
,Sales.CustomerInfo.RegistrationDate
,Sales.CustomerInfo.CustomerPhotoFK
,Sales.CustomerInfo.SocialNo
,Sales.CustomerInfo.WebPage
,Sales.CustomerInfo.JobFK
,Sales.CustomerInfo.MaxDebitLimit
,Sales.CustomerInfo.MaxChequeCredit
,Sales.CustomerInfo.PreferedPaymentMethodFK
,Sales.CustomerInfo.FirstBalanceKind
,Sales.CustomerInfo.FirstBalance
,Sales.CustomerInfo.Debit
,Sales.CustomerInfo.Credit
,Sales.CustomerInfo.Note
,Sales.CustomerInfo.FinancialPeriodFK
,Sales.CustomerInfo.CompanyInfoFK
,Sales.CustomerInfo.BlackListed
,Sales.CustomerInfo.IsActive
)
SELECT Sales.CustomerInfo.CustomerInfoID
,FullTitle = (cast(Sales.CustomerInfo.AccountFK AS NVARCHAR) + ' - ' + Sales.CustomerInfo.FullName)
,Sales.CustomerInfo.TopicFK
,Sales.CustomerInfo.AccountFK
,Sales.CustomerInfo.CompanyRegNo
,Sales.CustomerInfo.PersonTypeFK
,Sales.CustomerInfo.BankAccountDetail
,Sales.CustomerInfo.BankAccountNo
,Sales.CustomerInfo.AccountNo
,Sales.CustomerInfo.FullName
,Sales.CustomerInfo.Birthdate
,Sales.CustomerInfo.TitleFK
,Sales.CustomerInfo.RegistrationDate
,Sales.CustomerInfo.CustomerPhotoFK
,Sales.CustomerInfo.SocialNo
,Sales.CustomerInfo.WebPage
,Sales.CustomerInfo.JobFK
,Sales.CustomerInfo.MaxDebitLimit
,Sales.CustomerInfo.MaxChequeCredit
,Sales.CustomerInfo.PreferedPaymentMethodFK
,Sales.CustomerInfo.FirstBalanceKind
,Sales.CustomerInfo.FirstBalance
,Sales.CustomerInfo.Debit
,Sales.CustomerInfo.Credit
,Sales.CustomerInfo.Note
,Sales.CustomerInfo.FinancialPeriodFK
,Sales.CustomerInfo.CompanyInfoFK
,cte.Debit1
,cte.Credit1
,cte.ResDEBIT
,cte.ResCREDIT
,Sales.CustomerInfo.BlackListed
,Sales.CustomerInfo.IsActive
,CASE
WHEN (ResDEBIT > ResCREDIT)
THEN (ResDEBIT)
WHEN (ResCREDIT > ResDEBIT)
THEN (ResCREDIT)
ELSE 0
END AS Mande
,CASE
WHEN (ResDEBIT > ResCREDIT)
THEN ('debit')
WHEN (ResCREDIT > ResDEBIT)
THEN ('credit')
ELSE ('ziro')
END AS STATUS
FROM Sales.CustomerInfo
LEFT JOIN cte ON Sales.CustomerInfo.AccountFK = cte.AccountFK

Checking for prime number in boolean expression without defining a function

Could the following PL/SQL code be completed by providing some boolean expression for IF statement?
declare
N int := extract(year from sysdate);
begin
if INSERT_YOUR_BOOLEAN_EXPRESSION_HERE then
dbms_output.put_line('Current year is prime number.');
else
dbms_output.put_line('Current year is not prime number.');
end if;
end;
Obviously, you can't define your own function.
Only standard Oracle 11g PL/SQL functions are allowed.
The code should work properly during years 2014-9999.
EDIT :
Answer is accepted, but problem is not solved as it was desired.
So, let's go on.
Let's reduce time interval to just 256 years in nearest future: 2014-2269
Will you be able to find another solution, more clever and more compact, without external dependencies outside Oracle server?
It requires some bright idea to succeed in this task.
EDIT #2 :
The current record is 41 symbols long: not regexp_like(rpad(1,N,1),'^(11+)\1+$')
Now may be someone can provide even more brilliant solution?
I would be impressed enough to award one more king-size bounty ))
Beat the current record by at least 1 symbol.
Ok, here is another solution:
declare
N int := extract(year from sysdate);
begin
if not regexp_like(rpad('1', N, '1'),'^1?$|^(11+?)\1+$')
then
dbms_output.put_line('Current year is prime number.');
else
dbms_output.put_line('Current year is not prime number.');
end if;
end;
It is good up to 32767 (size of varchar2 in PL/SQL)
Second Attempt - 40 characters
regexp_instr(rpad(2,N+1),'2( +)\1+$')=0
Based on #vav's answer, with a few minor changes. Replacing not regexp_like... with regexp_count...=0 saves one character. The other changes are cosmetic - replacing the character 1 with 2 to distinguish between the character and the backreference; using N+1, the default rpad parameter, and spaces just to show a slightly different way to do it. regexp_count could also work here but that function is newer than other regular expression functions.
First Attempt - 54 characters
Here is a completely impracticable solution that just so happens to use a very small number of characters for the expression (54), and in no way resembles code golf.
declare
N int := extract(year from sysdate);
begin
if httpuritype('goo.gl/qMu5eR').getClob like'% '||n||' %' then
dbms_output.put_line('Current year is prime number.');
else
dbms_output.put_line('Current year is not prime number.');
end if;
end;
Make it all on one screen and require no internet connection:
declare
N int := extract(year from sysdate);
begin
if case
when least(
mod(N, 2), mod(N, 3), mod(N, 5), mod(N, 7), mod(N, 11)
,mod(N, 13), mod(N, 17), mod(N, 19), mod(N, 23), mod(N, 29)
,mod(N, 31), mod(N, 37), mod(N, 41), mod(N, 43), mod(N, 47)
,mod(N, 53), mod(N, 59), mod(N, 61), mod(N, 67), mod(N, 71)
,mod(N, 73), mod(N, 79), mod(N, 83), mod(N, 89), mod(N, 97)
)
= 0 then 'NOT PRIME'
ELSE 'PRIME'
end = 'PRIME' then
dbms_output.put_line('Current year is prime number.');
else
dbms_output.put_line('Current year is not prime number.');
end if;
end;
Comment out last 2 lines of mods if you OK to stay under 2269.
It is scalable to a certain degree, it goes with O(sqrt(n)).
Try this:
declare
N int := extract(year from sysdate);
begin
if case
when N in
(2017, 2027, 2029, 2039, 2053,
2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129,
2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213,
2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287,
2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357,
2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423,
2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531,
2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617,
2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687,
2689, 2693, 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741,
2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819,
2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903,
2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999,
3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079,
3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181,
3187, 3191, 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257,
3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331,
3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413,
3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511,
3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571,
3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643,
3659, 3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727,
3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821,
3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907,
3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989,
4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057,
4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139,
4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231,
4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297,
4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409,
4421, 4423, 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493,
4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583,
4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657,
4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751,
4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831,
4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937,
4943, 4951, 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003,
5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087,
5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179,
5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279,
5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387,
5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443,
5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521,
5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639,
5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693,
5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791,
5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857,
5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939,
5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053,
6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133,
6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221,
6229, 6247, 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301,
6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367,
6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473,
6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571,
6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673,
6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761,
6763, 6779, 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833,
6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917,
6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997,
7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103,
7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207,
7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297,
7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411,
7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499,
7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561,
7573, 7577, 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643,
7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723,
7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829,
7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919,
7927, 7933, 7937, 7949, 7951, 7963, 7993, 8009, 8011, 8017,
8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111,
8117, 8123, 8147, 8161, 8167, 8171, 8179, 8191, 8209, 8219,
8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291,
8293, 8297, 8311, 8317, 8329, 8353, 8363, 8369, 8377, 8387,
8389, 8419, 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501,
8513, 8521, 8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597,
8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677,
8681, 8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741,
8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831,
8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929,
8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007, 9011,
9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109,
9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181, 9187, 9199,
9203, 9209, 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283,
9293, 9311, 9319, 9323, 9337, 9341, 9343, 9349, 9371, 9377,
9391, 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439,
9461, 9463, 9467, 9473, 9479, 9491, 9497, 9511, 9521, 9533,
9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631,
9643, 9649, 9661, 9677, 9679, 9689, 9697, 9719, 9721, 9733,
9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811,
9817, 9829, 9833, 9839, 9851, 9857, 9859, 9871, 9883, 9887,
9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973)
then 'PRIME'
ELSE 'NOT PRIME'
end = 'PRIME' then
dbms_output.put_line('Current year is prime number.');
else
dbms_output.put_line('Current year is not prime number.');
end if;
end;
Share and enjoy.
declare
N int := extract(year from sysdate);
begin
if mod(n,2)<>0 and mod(n,3)<>0 and mod(n,5)<>0 and mod(n,7)<>0
and mod(n,11)<>0 and mod(n,13)<>0 and mod(n,17)<>0 and mod(n,19)<>0
and mod(n,23)<>0 and mod(n,29)<>0 and mod(n,31)<>0 and mod(n,37)<>0
and mod(n,41)<>0 and mod(n,43)<>0 and mod(n,47)<>0 then
dbms_output.put_line('Current year is prime number.');
else
dbms_output.put_line('Current year is not prime number.');
end if;
end;
This works stable for the interval 2014-2269
UPD: Minimum number of comparisons i've found is:
when mod(n,10) in (1,3,7,9) and mod(n,3)<>0
and mod(n,7)<>0 and mod(n,11)<>0 and mod(n,13)<>0
and mod(n,17)<>0 and mod(n,19)<>0 and mod(n,23)<>0
and mod(n,29)<>0 and mod(n,31)<>0 and mod(n,37)<>0
and mod(n,41)<>0 and mod(n,43)<>0 and mod(n,47)<>0

Problem in oracle query

Hai guys,
I've a query in which i need to interchange the values of two fields.
The query is as follows:
SELECT TO_DATE(A.G_LEDGER_DATE,'dd/mm/YYY')as G_LEDGER_DATE,C.ACC_MASTER_NAME,
A.G_LEDGER_REF_NO ,
NVL(CASE WHEN B.G_LEDGER_SECTION = 1 THEN
CASE WHEN
(SELECT COUNT(*)FROM SOSTRANS.ACC_GEN_LEDGER WHERE G_LEDGER_SECTION = B.G_LEDGER_SECTION AND G_LEDGER_ID = B.G_LEDGER_ID)> 1 THEN
B.G_LEDGER_VALUE ELSE A.G_LEDGER_VALUE END END,0) AS G_LEDGER_DR_VALUE,
NVL(CASE WHEN B.G_LEDGER_SECTION = -1 THEN
CASE WHEN
(SELECT COUNT(*) FROM SOSTRANS.ACC_GEN_LEDGER WHERE G_LEDGER_SECTION = B.G_LEDGER_SECTION AND G_LEDGER_ID = B.G_LEDGER_ID)> 1 THEN
B.G_LEDGER_VALUE ELSE A.G_LEDGER_VALUE END END,0) AS G_LEDGER_CR_VALUE,
B.G_LEDGER_SECTION,C.ACC_MASTER_ID,SUBSTR(A.G_LEDGER_REF_NO,0,3) AS Types,'Z' as OrderChar ,
CASE WHEN A.G_LEDGER_REMARK IS NULL THEN B.G_LEDGER_REMARK ELSE A.G_LEDGER_REMARK END AS Narration
FROM SOSTRANS.ACC_GEN_LEDGER A
LEFT OUTER JOIN SOSTRANS.ACC_GEN_LEDGER B ON A.G_LEDGER_ID = B.G_LEDGER_ID
LEFT OUTER JOIN SOSMASTER.ACC_ACCOUNT_MASTER C ON A.ACC_MASTER_ID = C.ACC_MASTER_ID WHERE A.G_LEDGER_CANCEL='N' AND
B.ACC_MASTER_ID = 'MSOS000001' AND
A.ACC_MASTER_ID <> 'MSOS000001' AND
A.G_LEDGER_SECTION <> B.G_LEDGER_SECTION AND
A.G_LEDGER_DATE >= '25/sep/2009' AND
A.G_LEDGER_DATE<='26/sep/2009'
ORDER BY OrderChar,G_LEDGER_DATE
Now i get the output as
... G_LEDGER_DR_VALUE G_LEDGER_CR_VALUE .....
... 2000 0 .....
... 3000 0 .....
... -1000 0 .....
I need to get the negetive value of the G_LEDGER_DR_VALUE side in G_LEDGER_CR_VALUE and if negetive value exists in G_LEDGER_CR_VALUE then it should be in the G_LEDGER_DR_VALUE field
Can anyone help me to solve this?
If I understood your question well, you select a value (that I will call g_ledger_value) that you want to appear in a different column depending on its sign.
This is how I would do it :
SELECT
CASE WHEN t.g_ledger_value>0 THEN t.g_ledger_value ELSE 0 END AS g_ledger_dr_value,
CASE WHEN t.g_ledger_value<0 THEN t.g_ledger_value ELSE 0 END AS g_ledger_cr_value
FROM
(SELECT g_ledger_value FROM mytable) t;
It sounds like a combination of SIGN() and CASE is what you need ...
CASE WHEN SIGN(G_LEDGER_DR_VALUE) = -1 then ...
ELSE ...
END
etc
SELECT G_LEDGER_DR_VALUE,
CASE WHEN G_LEDGER_DR_VALUE < 0
THEN G_LEDGER_CR_VALUE
ELSE G_LEDGER_DR_VALUE
END
FROM (...)
Is it that you mean? I suggest calculate values of CR___VALUE and DR_VALUE in subquery, and then in wrapping query make CASE which returns you correct value.

Resources