前言:
目的:
如果有兩大類模組是多對多的組合,如本次Smaple Code. Nick和Addidas 包包都有紅、藍、黃….或其他顏色
就可能呈現下面6種組合
- Nick(紅)
- Nick(藍)
- Nick(黃)
- Addidas(紅)
- Addidas(藍)
- Addidas(黃)
如果此建立類別的話 可能情況如下面的UNL圖
這樣會有兩個問題
- 隨著品牌和顏色增多,包包類別數量急速增長 (X = m*n)個
- 顏色我們可看做一個抽象 不應當和包包合在一起
之前有和大家分享使用CASE WHEN 搭配聚合函數實現樞紐分析
但今天如果我們要轉換成行的列希望是動態依照目前資料庫的欄位要處理呢?
我們可以使用Dynamic pivot
``Dynamic pivot 核心概念其實是把我們要使用的
pivot SQL`語法動態產生出來
CREATE TABLE T(
userName VARCHAR(100),
Price int,
Dt DATE
);
INSERT INTO T VALUES ('Tom',100,'2017-01-01');
INSERT INTO T VALUES ('Amy',200,'2017-01-02');
INSERT INTO T VALUES ('Tom',1311,'2017-01-03');
INSERT INTO T VALUES ('Tom',122,'2017-03-01');
INSERT INTO T VALUES ('Tom',111,'2017-04-01');
INSERT INTO T VALUES ('Amy',232,'2017-05-01');
INSERT INTO T VALUES ('Tom',2312,'2017-05-02');
INSERT INTO T VALUES ('Tom',23,'2017-05-03');
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
SET @SQL = STUFF((SELECT distinct ',SUM(CASE WHEN Dt = '''+ CAST(Dt AS VARCHAR(10)) +''' THEN Price ELSE 0 END) AS ' + QUOTENAME(Dt)
FROM T
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)')
,1,1,'');
SET @query = 'SELECT userName,'+@cols+' FROM T GROUP BY userName' ;
EXECUTE sp_executesql @query
因為範例我們使用 SQL SERVER
所以使用 FOR XML PATH 語法將我們** CASE WHEN pivot SQL **語法產生並把他附值給 @cols
變數
SET @cols = STUFF((SELECT distinct ',SUM(CASE WHEN Dt = '''+ CAST(Dt AS VARCHAR(10)) +''' THEN Price ELSE 0 END) AS ' + QUOTENAME(Dt)
FROM T
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)')
,1,1,'')
某些專案因為歷史久遠沒有Source Code,但有個需求需要異動裡面的程式該怎麼辦??
難道只能整個反組譯,查看程式碼翻一份做新的嗎?
不~~其實有辦法直接對於DLL進行修改
只需使用 ** Reflexil 搭配 ILSpy 或其他支援的反組譯軟體 **
Reflexil 是一個組譯編輯器插件目前支援 Reflector, ILSpy 和 Telerik’s JustDecompile.
下載連結
Reflexil **Release 2.2 搭配 ILSpy version 3.2
之前有介紹 (SQL Server) CTE RECURSIVE (遞迴)製作月曆 在Oracle
有提供一個精簡的語法產生階層資料 CONNECT BY
CONNECT BY 有幾個常用Key Word.
LEVEL
目前在樹節點第幾階層START WITH
設定哪筆做為起始點開始樹PRIOR
用於指定父資料欄位製造出的階層樹,概念如下
[圖來自Oracle]
<code class="language-sql">SELECT X + LEVEL
FROM (
SELECT 0 X
FROM DUAL
)
CONNECT BY LEVEL <= 10
此範例使用 LEVEL
在 CONNECT BY
上當條件 建立列值到LEVEL
大於等於 10
本篇利用RabbitMQ client來簡單實現MQ功能.
在RabbitMQ中有很重要兩個角色,Producer
和Consumer
,下面這個範例使用c# console
來實現.
我個人覺得APMQ協議和Http協議有點類似,一樣有Header(Properties),body…等等概念.
一開始我們宣告一個 ConnectionFactory 並設置RabbitMQ Server連接參數
RabbitMQ預設密碼是 guest
//建立連接工廠
ConnectionFactory factory = new ConnectionFactory
{
UserName = "guest",
Password = "guest",
HostName = "localhost"
};
呼叫factory.CreateConnection
建立連接RabbitMQ連接物件,並呼叫 CreateModel
方法建立一個channel
Model
在Github這邊要先建立兩個Repository
這個Repository是利用Hexo cli樣板來撰寫Blog.
像我目前使用的MyBlog
建立完自己的Code Repository後.
將他clone到自己電腦上面.
執行下面幾個步驟
CMD
並進入此資料夾NodeJS NPM
打 npm install hexo -g
就會開始下載 Hexo init
指令,安裝看建立Hexo將檔案.網路上已經有許多Blog託管平台 例如:Google Blog,痞客邦….為何我還要自己寫這篇跟大家分享?
因為上面提供的平台固然好用,但我並無法100%的去修改我想要的樣式或版面.
如果我想要有100%彈性修改我的Blog我就必須建立自己的網站.
但要給別人Hosting需要另外花一筆費用…
就有本次系列文 Github (hosting) + Hexo (Blog) + Appveyor(CICD)
.
這個搭配有幾個優點:
撰寫發布流程大概如下圖
這個文章和大家分享解說 Func<>和Action<>
最後帶著大家來實現自己的Linq Where
先來看 Func<> ,Action<>
原始定義
我們發現Func<> ,Action<>
其實本質就是委託 ,雖然有十幾個重載 但大同小異
public delegate TResult Func<out TResult>();
public delegate void Action<in T>(T obj);
Func
固定最後一個泛型參數為方法回傳值,其餘是傳入參數
public delegate TResult Func<in T, out TResult>(T arg);
宣告一個Func<Person,string>
委託 _thunkCheckAge
_thunkCheckAge
委託指向CheckAge
方法
執行_thunkCheckAge
委託 (執行CheckAge
方法)