Pages

Subscribe:

Ads 468x60px

Labels

2014年3月11日 星期二

如何用單一SELECT 語法完成樞紐分析表,

SELECT p1.*, ( p1.Sum_a1+p1.Sum_a2+p1.Sum_b1) as Sum_All
from (select item,
    SUM(CASE class WHEN 'a1' THEN qty ELSE 0 END) AS Sum_a1,
    SUM(CASE class WHEN 'a2' THEN qty ELSE 0 END) AS Sum_a2,
    SUM(CASE class WHEN 'b1' THEN qty ELSE 0 END) AS Sum_b1
FROM testdata as p
GROUP BY item WITH ROLLUP
 ) as p1 


資料來源

MSSQL類似MySQL(GROUP_CONCAT)功能!

拜EXCEL所賜,現在做報表很多需求都是使用者從原來EXCEL表單轉換而來~
一般而言,如果我們有Group by需求的報表,絕大部分都是看彙總後的資料,像是AVG、SUM、COUNT…等等
或者使用者想看類似樞紐分析表資料長相的時候,SQL SERVER 2005 提供 PIVOT也能幫得上忙。
( 基本上要不是走入IT這行,我覺得EXCEL用的好,很多報表可以不用做的那麼辛苦 !!)
Anyway 在使用者最大情況下,IT小小工程師也只能儘量滿足需求。
某天在廠區工作的時候,就遇到這種情況,使用者想要的報表長相如下:
Server1
而實際在資料庫內的資料呈現則是如下圖:
Server3

一般來說,我們針對這種資料,都會使用矩陣來呈現報表,如下圖:
Server2
透過Reporting Service來製作矩陣報表,真的非常容易,但要呈現使用者需要的樣子,就得在SQL上面偷偷下工夫了。
拜古哥幫忙,剛好找到如下討論串

那麼就照網址內容依樣畫葫蘆,首先來建立TABLE吧
步驟1:
CREATE TABLE [dbo].[DAPON_TB](
    [CITY] [nvarchar](50) COLLATE Chinese_Taiwan_Stroke_CI_AS NULL,
    [PRODUCT] [nvarchar](50) COLLATE Chinese_Taiwan_Stroke_CI_AS NULL,
    [STORE] [nvarchar](50) COLLATE Chinese_Taiwan_Stroke_CI_AS NULL
) ON [PRIMARY]

步驟2:在Reporting Service內新增一張報表,並且新增資料集,SQL語法則如下
SELECT G.CITY,G.PRODUCT,
        STUFF
        (
            (
             SELECT CAST(':' AS VARCHAR(MAX))+U.STORE
             FROM DAPON_TB AS U
             WHERE U.PRODUCT=G.PRODUCT                                                  
             
             FOR XML PATH('')
            )
            ,1
            ,1
            ,''
        ) AS STORES,G.STORE
    FROM DAPON_TB AS G

步驟3:如果資料集SQL沒下錯,就會像下圖一樣。
Server5

步驟4:請在工具箱拉一個矩陣到配置視窗上,並依照下圖方式將欄位資料放上
Server6

步驟5:完成後點預覽,即可看到結果,如下
Server7

結論:整個重點還是在如何把資料轉成如下圖長相,參考一下步驟2的SQL語法吧!
Server8

趨勢科技瞄準兒童網安

(中央社記者江明晏台北11日電)家長們對兒童網安的需求日漸升高,趨勢科技推出有「家長防護網」功能的資安軟體,呼籲家長,要多多關心兒童上網行為。
根據警政署統計,去年一整年全台就有近3萬人失蹤,光是今年1月就有2千多起案例,國中、小學兒童在上學途中失蹤的達109人,其中不乏有與使用社群媒體或網路上交友有關的案例。
趨勢科技呼籲家長,要多多關心兒童上網行為,並使用有「家長防護網」功能的資安軟體,幫孩子過濾不良網站、管理上網行為,事先避免兒童被網路不良人士拐騙、甚至失蹤的悲劇。
有鑑於家長們對兒童網安的需求,趨勢科技PC-cillin2014雲端版,貼心納入「家長防護網」功能,賦予忙碌的家長更多的網路防護權限,可保護孩子們的網路行為,例如,可依據孩子不同年齡層、設定不同的網站內容等級;可規定孩子上網時段、或每天可使用電腦的時數;還可依照平日、假日做不同的設定。
此外,針對沉迷網路遊戲的兒童,還可防止他們在非規定的時間內玩電腦遊戲或使用指定的軟體,最後,「家長防護網」還提供一目了然的分析圖表,讓家長知道孩子的所有使用行為、及孩子嘗試瀏覽的不良網站清單等。1030311

Google網路廣告獲利 遭行動App侵蝕

Google幾乎是網路搜尋的代名詞,但愈來愈多用戶轉向行動裝置,且大把時間都是花在應用程式(App)而非網路上,Google的廣告獲利面臨的挑戰日增。為因應變局,該公司推出在搜尋結果中納入相關App資訊的新策略,致力於開拓新財源。
Google過去靠網路蜘蛛(spider)抓取網路資料,以精密的演算法對搜尋結果進行排名,但行動裝置用戶大多使用App,這套方法派不上用場,威脅Google規模500億美元的廣告業務。
Google去年秋季因此推出拓展行動用戶的新搜尋策略,模仿Google網路版網頁,當用戶使用智慧手機搜尋時,除關鍵字相關資料外,還會顯示相關App下載連結並詳列其功能。
臉書和推特等科技業者也紛紛採取類似行動,向App收取廣告費用以換取廣告頁面,臉書新策略已見初步成效。Google的行動已獲數家App業者支持,包括維基百科、旅遊網站Expedia與電影資料庫IMDB的App連結,都會出現在搜尋結果中。
對智慧手機來說,App連結比網頁連結更實用,像是可依螢幕大小自動調整,並納入手機定位功能以提供更多資訊。Google計劃讓App開發商遞交App以建構搜尋資料庫。

2014年3月9日 星期日

2014年3月7日 星期五

從PHP網頁將資料匯出成Excel檔

[Dreamweaver]從PHP網頁將資 料匯出成Excel檔

雖然網路上已經有重點說明,但對於習慣使用DW的我,還是不能符合需求....
自己試了很久....才試出我要的方式 -- 呼叫資料庫的資料,按連結轉成excel檔
做法:
資料庫名稱test,資料表ta和tb
          資料表ta
aidaclassaname
11蘋果
21鳳梨
32波蔡
42小白菜
53豬肉
63牛肉
74金魚
84吳郭魚
       
         資料表tb
aclassclassname
1水果
2蔬菜
3肉類
4魚類
1.將表格和頁首設定好,並做一個連結,作為下載excel的按鈕


匯出excel檔


 
  td> 
編號種類名稱< /td>
 
 

匯出excel



2.連到資料庫,新增資料集Recordset1,用進階選項,SQL內填入:
SELECT ta.aid, ta.aname, tb.classname FROM ta LEFT JOIN tb ON ta.aclass = tb.aclass GROUP BY ta.aid, ta.aname
新增一樣的資料集,名稱為Recordset2


if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
{
  $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
  $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);
  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;    
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}
}
 
mysql_select_db($database_testbata, $testbata);
$query_Recordset1 = "SELECT ta.aid, ta.aname, tb.classname FROM ta LEFT JOIN tb ON ta.aclass = tb.aclass GROUP BY ta.aid, ta.aname";
$Recordset1 = mysql_query($query_Recordset1, $testbata) or die(mysql_error());
$row_Recordset1 = mysql_fetch_assoc($Recordset1);
$totalRows_Recordset1 = mysql_num_rows($Recordset1);
 
mysql_select_db($database_testbata, $testbata);
$query_Recordset2 = "SELECT ta.aid, ta.aname, tb.classname FROM ta LEFT JOIN tb ON ta.aclass = tb.aclass GROUP BY ta.aid, ta.aname";
$Recordset2 = mysql_query($query_Recordset2, $testbata) or die(mysql_error());
$row_Recordset2 = mysql_fetch_assoc($Recordset2);
$totalRows_Recordset2 = mysql_num_rows($Recordset2);
?>
...

3.將資料顯示於table內,重複區域

...

 
  
編號種類名稱< /td>
>

...

4.複製下面語法至內最後面

if ($_GET['act']=='download') {
  downloadxls();
  die();
}
function downloadxls(){
$filename="test.xls";
header("Content-disposition: filename=$filename");
header("Content-type: application/octetstream");
header("Pragma: no-cache");
header("Expires: 0");
}

5.複製table語法貼於function內;剪下php內的Recordset2部分,貼於function內;並做修改

function downloadxls(){
$query_Recordset2 = "SELECT ta.aid, ta.aname, tb.classname FROM ta LEFT JOIN tb ON ta.aclass = tb.aclass GROUP BY ta.aid, ta.aname";  
$Recordset2 = mysql_query($query_Recordset2);
$totalRows_Recordset2 = mysql_num_rows($Recordset2);
 
$filename="test.xls";
header("Content-disposition: filename=$filename");
header("Content-type: application/octetstream");
header("Pragma: no-cache");
header("Expires: 0");
 
echo "& lt;td>名稱
編號種類
";
for ($i=0;$i<$totalRows_Recordset2;$i++)
{
$row_Recordset2 = mysql_fetch_array($Recordset2);
echo " ".$row_Recordset2['aid']."".$row_Recordset2['aname']."".$row_Recordset2['classname']." ";
$j=$i+1;
}
echo "
";
}


excel輸入數值超過12位數會轉為科學符號..很困擾

儲存格格式/[數值]:類別(C): 選擇 自訂/將類型改為 0

注意:最長位數到 Double 的上限,1 開頭是 16 位數,其他開頭是 15 位數,超過此長度的話,請改用字串格式,也就是 '1234567890123456790