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
資料來源
2014年3月11日 星期二
MSSQL類似MySQL(GROUP_CONCAT)功能!
拜EXCEL所賜,現在做報表很多需求都是使用者從原來EXCEL表單轉換而來~
一般而言,如果我們有Group by需求的報表,絕大部分都是看彙總後的資料,像是AVG、SUM、COUNT…等等
或者使用者想看類似樞紐分析表資料長相的時候,SQL SERVER 2005 提供 PIVOT也能幫得上忙。
( 基本上要不是走入IT這行,我覺得EXCEL用的好,很多報表可以不用做的那麼辛苦 !!)
Anyway 在使用者最大情況下,IT小小工程師也只能儘量滿足需求。
某天在廠區工作的時候,就遇到這種情況,使用者想要的報表長相如下:
而實際在資料庫內的資料呈現則是如下圖:
一般來說,我們針對這種資料,都會使用矩陣來呈現報表,如下圖:
透過Reporting Service來製作矩陣報表,真的非常容易,但要呈現使用者需要的樣子,就得在SQL上面偷偷下工夫了。
拜古哥幫忙,剛好找到如下討論串
參考網址:http://social.msdn.microsoft.com/Forums/en/transactsql/thread/f09d4166-2030-41fe-b86e-392fbc94db53
那麼就照網址內容依樣畫葫蘆,首先來建立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沒下錯,就會像下圖一樣。
步驟4:請在工具箱拉一個矩陣到配置視窗上,並依照下圖方式將欄位資料放上
步驟5:完成後點預覽,即可看到結果,如下
結論:整個重點還是在如何把資料轉成如下圖長相,參考一下步驟2的SQL語法吧!
趨勢科技瞄準兒童網安
(中央社記者江明晏台北11日電)家長們對兒童網安的需求日漸升高,趨勢科技推出有「家長防護網」功能的資安軟體,呼籲家長,要多多關心兒童上網行為。
根據警政署統計,去年一整年全台就有近3萬人失蹤,光是今年1月就有2千多起案例,國中、小學兒童在上學途中失蹤的達109人,其中不乏有與使用社群媒體或網路上交友有關的案例。
趨勢科技呼籲家長,要多多關心兒童上網行為,並使用有「家長防護網」功能的資安軟體,幫孩子過濾不良網站、管理上網行為,事先避免兒童被網路不良人士拐騙、甚至失蹤的悲劇。
有鑑於家長們對兒童網安的需求,趨勢科技PC-cillin2014雲端版,貼心納入「家長防護網」功能,賦予忙碌的家長更多的網路防護權限,可保護孩子們的網路行為,例如,可依據孩子不同年齡層、設定不同的網站內容等級;可規定孩子上網時段、或每天可使用電腦的時數;還可依照平日、假日做不同的設定。
此外,針對沉迷網路遊戲的兒童,還可防止他們在非規定的時間內玩電腦遊戲或使用指定的軟體,最後,「家長防護網」還提供一目了然的分析圖表,讓家長知道孩子的所有使用行為、及孩子嘗試瀏覽的不良網站清單等。1030311
Google網路廣告獲利 遭行動App侵蝕
作者: 編譯楊宛盼╱綜合外電 | 聯合新聞網 – 2014年3月11日 上午3:48
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
aid | aclass | aname |
1 | 1 | 蘋果 |
2 | 1 | 鳳梨 |
3 | 2 | 波蔡 |
4 | 2 | 小白菜 |
5 | 3 | 豬肉 |
6 | 3 | 牛肉 |
7 | 4 | 金魚 |
8 | 4 | 吳郭魚 |
資料表tb
aclass | classname |
1 | 水果 |
2 | 蔬菜 |
3 | 肉類 |
4 | 魚類 |
1.將表格和頁首設定好,並做一個連結,作為下載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;
}
}
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);
$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);
$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");
}
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 "
";$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 "
$j=$i+1;
}
echo "
echo "
}
excel輸入數值超過12位數會轉為科學符號..很困擾
儲存格格式/[數值]:類別(C): 選擇 自訂/將類型改為 0
注意:最長位數到 Double 的上限,1 開頭是 16 位數,其他開頭是 15 位數,超過此長度的話,請改用字串格式,也就是 '1234567890123456790
訂閱:
文章 (Atom)