 |
SQL Pivot แทนค่า แล้วใส่ ค่า Statment query ไม่ได้ |
|
 |
|
|
 |
 |
|
สอบถามครับ ใช่ CodeIgniter เขียน
ผมส่ง Data มาที่ model ได้ค่ามาแล้ว แต่ไป ยัดค่าใส่ query pivot (ปัญหาคือ data ที่ใส่ query มาไม่ครบ)
ข้อมูลที่จะใส่ query

query error data มาไม่ครบ

Code (SQL)
public function FSaMPRGDataTable($paData, $paDataDpcDisCodeYSet){
$tDpcDisCodeYSet = $paDataDpcDisCodeYSet;
print_r($tDpcDisCodeYSet);
$nLngID = $paData['FNLngID'];
$tSQL = " SELECT PPV.*,
PLL.FTDisName,
CASE PLC.FTDisGroup
WHEN 1 THEN 'ITEM'
WHEN 2 THEN 'PROMOTION'
WHEN 3 THEN 'SUB'
ELSE 'N/A'
END AS FTDisGroup,
CASE WHEN PLC.FTDisStaPrice = 1 THEN 'Full Price/Set Price' ELSE 'Net Peice' END AS FTDisStaPrice
FROM (
SELECT
--แทนค่าตัวแปร tYColumnShow ตรงนี้
FTDpcDisCodeX,
FTDpcDisCodeY1,
FTDpcStaAlw1,
FTDpcDisCodeY2,
FTDpcStaAlw2,
FTDpcDisCodeY3,
FTDpcStaAlw3,
FTDpcDisCodeY4,
FTDpcStaAlw4,
FTDpcDisCodeY5,
FTDpcStaAlw5,
FTDpcDisCodeY6,
FTDpcStaAlw6
FROM(
SELECT FTDpcDisCodeX,
col + CAST(seq AS VARCHAR(10)) AS col,
value
FROM
(
SELECT FTDpcDisCodeX,
FTDpcStaAlw,
FTDpcDisCodeY,
ROW_NUMBER() OVER(PARTITION BY FTDpcDisCodeX
ORDER BY FTDpcDisCodeX) seq
FROM TPSTDiscPolicy
) d
CROSS APPLY
(
SELECT 'FTDpcStaAlw',
CAST(FTDpcStaAlw AS VARCHAR(20))
UNION ALL
SELECT 'FTDpcDisCodeY',
FTDpcDisCodeY
) c(col, value)
) src PIVOT(MAX(value) FOR col IN(
$tDpcDisCodeYSet
)) piv ) PPV
INNER JOIN TSysDisPolicy PLC ON PPV.FTDpcDisCodeX = PLC.FTDisCode
INNER JOIN TSysDisPolicy_L PLL ON PPV.FTDpcDisCodeX = PLL.FTDisCode AND PLL.FNLngID = $nLngID
";
$oQuery = $this->db->query($tSQL);
}
Tag : PHP, Ms SQL Server 2016, CodeIgniter
|
ประวัติการแก้ไข 2020-07-19 13:06:49 2020-07-19 13:08:19
|
 |
 |
 |
 |
Date :
2020-07-19 13:05:22 |
By :
Mariner |
View :
684 |
Reply :
15 |
|
 |
 |
 |
 |
|
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
IN operator ถ้าไม่ใช่ array ก็ต้องใส่ single quote ให้กับ value ด้วย
Code (SQL)
...IN ('Germany', 'France', 'UK');
$paDataDpcDisCodeYSet ที่รับมาเป็น string (ไม่ใช่ array) อยู่แล้วก็ replace เลย
Code (PHP)
//...
$tDpcDisCodeYSet = $paDataDpcDisCodeYSet;
$tDpcDisCodeYSet = str_replace(",", "','", $tDpcDisCodeYSet);
$tDpcDisCodeYSet = str_replace($tDpcDisCodeYSet, "'".$tDpcDisCodeYSet."'", $tDpcDisCodeYSet);
//...
|
 |
 |
 |
 |
Date :
2020-07-19 14:56:11 |
By :
PhrayaDev |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ตอบความคิดเห็นที่ : 1 เขียนโดย : PhrayaDev เมื่อวันที่ 2020-07-19 14:56:11
รายละเอียดของการตอบ ::
ไม่ได้อ่ะครับพี่
echo data มาดูครบครับ แต่พอเอาไปแทน ข้อมูลเข้าไปไม่ครบ ผมก็งง
ค่าที่ออกมาต้องประมาณนี้ครับ
Code (SQL)
) src PIVOT(MAX(value) FOR col IN(
FTDpcDisCodeY1,
FTDpcStaAlw1,
FTDpcDisCodeY2,
FTDpcStaAlw2,
FTDpcDisCodeY3,
FTDpcStaAlw3,
FTDpcDisCodeY4,
FTDpcStaAlw4,
FTDpcDisCodeY5,
FTDpcStaAlw5,
FTDpcDisCodeY6,
FTDpcStaAlw6
)) piv ) PPV
|
ประวัติการแก้ไข 2020-07-19 15:24:10
 |
 |
 |
 |
Date :
2020-07-19 15:19:57 |
By :
Mariner |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ครั้งแรก Incorrect syntax near ')'
คราวนี้ขึ้นว่าอะไรครับ
และถ้าเชื่อม query string กับตัวแปรด้วย . ได้หรือไม่
|
ประวัติการแก้ไข 2020-07-19 15:29:19
 |
 |
 |
 |
Date :
2020-07-19 15:27:31 |
By :
PhrayaDev |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
$paDataDpcDisCodeYSet ตัวแปรตัวนี้ มัน gen มาผิด ติดคอมม่าเกินมา 1 ตัว
|
 |
 |
 |
 |
Date :
2020-07-19 16:02:42 |
By :
Chaidhanan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ตอบความคิดเห็นที่ : 4 เขียนโดย : Chaidhanan เมื่อวันที่ 2020-07-19 16:02:42
รายละเอียดของการตอบ ::
ก่อนหน้านั้น ผมส่งมาไม่น่าผิดนะครับ
จาก controler ส่งมา model
Code (PHP)
$tDpcDisCodeYSet = '';
if($aResultData['rtCode'] == 1){
foreach($aResultData['raItems'] AS $key=>$aValue){
for ($i=1; $i<=$aValue['FTDpcDisCodeY']; $i++){
$tDpcDisCodeYSet = 'FTDpcDisCodeY' . $i.',' . 'FTDpcStaAlw'.$i ;
if($i < $aValue['FTDpcDisCodeY']){
$tDpcDisCodeYSet.= ',';
}
$tYColumnShow = $tDpcDisCodeYSet;
$aDatatable = $this->mDiscountpolicy->FSaMPRGDataTable($aData, $tDpcDisCodeYSet, $tYColumnShow);
}
}
}
Code (SQL)
public function FSaMPRGDataTable($paData, $paDataDpcDisCodeYSet, $paDataYColumnShow){
// $tDpcDisCodeYSet = $paDataDpcDisCodeYSet;
// $tDpcDisCodeYSet = str_replace(",", "','", $tDpcDisCodeYSet);
// $tDpcDisCodeYSet = str_replace($tDpcDisCodeYSet, "'".$tDpcDisCodeYSet."'", $tDpcDisCodeYSet);
// print_r($paDataDpcDisCodeYSet);
$nLngID = $paData['FNLngID'];
$tSQL = " SELECT PPV.*,
PLL.FTDisName,
CASE PLC.FTDisGroup
WHEN 1 THEN 'ITEM'
WHEN 2 THEN 'PROMOTION'
WHEN 3 THEN 'SUB'
ELSE 'N/A'
END AS FTDisGroup,
CASE WHEN PLC.FTDisStaPrice = 1 THEN 'Full Price/Set Price' ELSE 'Net Peice' END AS FTDisStaPrice
FROM (
SELECT
--แทนค่าตัวแปร tYColumnShow ตรงนี้
FTDpcDisCodeX,
FTDpcDisCodeY1,
FTDpcStaAlw1,
FTDpcDisCodeY2,
FTDpcStaAlw2,
FTDpcDisCodeY3,
FTDpcStaAlw3,
FTDpcDisCodeY4,
FTDpcStaAlw4,
FTDpcDisCodeY5,
FTDpcStaAlw5,
FTDpcDisCodeY6,
FTDpcStaAlw6
FROM(
SELECT FTDpcDisCodeX,
col + CAST(seq AS VARCHAR(10)) AS col,
value
FROM
(
SELECT FTDpcDisCodeX,
FTDpcStaAlw,
FTDpcDisCodeY,
ROW_NUMBER() OVER(PARTITION BY FTDpcDisCodeX
ORDER BY FTDpcDisCodeX) seq
FROM TPSTDiscPolicy
) d
CROSS APPLY
(
SELECT 'FTDpcStaAlw',
CAST(FTDpcStaAlw AS VARCHAR(20))
UNION ALL
SELECT 'FTDpcDisCodeY',
FTDpcDisCodeY
) c(col, value)
) src PIVOT(MAX(value) FOR col IN(
$tDpcDisCodeYSet
)) piv ) PPV
INNER JOIN TSysDisPolicy PLC ON PPV.FTDpcDisCodeX = PLC.FTDisCode
INNER JOIN TSysDisPolicy_L PLL ON PPV.FTDpcDisCodeX = PLL.FTDisCode AND PLL.FNLngID = $nLngID
";
$oQuery = $this->db->query($tSQL);
|
 |
 |
 |
 |
Date :
2020-07-19 16:14:28 |
By :
Mariner |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
พิสูจน์ต้นฉบับ
Code (PHP)
$tDpcDisCodeYSet = '';
if($aResultData['rtCode'] == 1){
foreach($aResultData['raItems'] AS $key=>$aValue){
for ($i=1; $i<=$aValue['FTDpcDisCodeY']; $i++){
$tDpcDisCodeYSet = 'FTDpcDisCodeY' . $i.',' . 'FTDpcStaAlw'.$i ;
if($i < $aValue['FTDpcDisCodeY']){
$tDpcDisCodeYSet.= ',';
}
echo $tDpcDisCodeYSet; // ดูว่ามี , ห้อยท้ายหรือไม่
//$tYColumnShow = $tDpcDisCodeYSet;
//$aDatatable = $this->mDiscountpolicy->FSaMPRGDataTable($aData, $tDpcDisCodeYSet, $tYColumnShow);
}
}
}
echo $tDpcDisCodeYSet; // ตรงนี้ด้วย ดูว่ามี , ห้อยท้ายหรือไม่
|
ประวัติการแก้ไข 2020-07-19 17:21:23 2020-07-19 17:22:14
 |
 |
 |
 |
Date :
2020-07-19 17:19:21 |
By :
PhrayaDev |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
Code (PHP)
$rs_array = [];
for($i = 0; $i < $target; $i++){
$rs_array[] = 'abc' . ',' . 'xyz';
}
echo implode(',', $rs_array);
|
 |
 |
 |
 |
Date :
2020-07-19 19:37:18 |
By :
Chaidhanan |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ดูๆ ไป เริ่มสงสัยว่า error ไม่ได้โกหก
Code (PHP)
$tSQL="...
PIVOT(MAX(value) FOR col IN(
$tDpcDisCodeYSet <-- ลองเปลี่ยนไปใช้แบบ hardcode --> FTDpcDisCodeY1,FTDpcStaAlw1,FTDpcDisCodeY2,FTDpcStaAlw2,...
))
..."
ถ้ายังติด error เดิมแสดงว่ามีผิดที่ statement
แต่ถ้าผ่านก็ต้องงมที่ string ต่อไป
|
 |
 |
 |
 |
Date :
2020-07-19 20:04:06 |
By :
PhrayaDev |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|