我在查询中做出的SUM有问题,如下所示:
修改 我用英语发布我的查询,所以每个人都明白我想说的话:
$sql = "SELECT
c.stock,
c.id as cid,
cb.course as ccourse,
cb.price_member as cbprice_member,
cb.price_not_member as cbprice_not_member,
cb.study as cbstudy,
cb.studentid,
(SELECT
SUM(CASE WHEN c.stock > 0 THEN price_member ELSE 0 END) AS subtotal_member,
c.stock
FROM
courses_orders cb
JOIN
courses c
ON
cb.course_id = c.id
WHERE
cb.date_removed IS NULL AND
cb.date_order_mail IS NOT NULL AND
cb.date_pickup IS NULL AND
cb.date_pickup_mail IS NULL AND
cb.studentid = '$studentid' AND
cb.course_id = '$cid' AND
c.stock > 0
) as subtotal_member,
(SELECT SUM(price_not_member) FROM courses_orders WHERE date_removed IS NULL AND date_order_mail IS NOT NULL AND date_pickup IS NULL AND date_pickup_mail IS NULL AND studentid = '$studentid' AND course_id = '$cid') as subtotal_not_member
FROM
courses c
JOIN
courses_orders cb
ON
cb.course_id = c.id
WHERE
c.id = '$cid' AND cb.date_removed IS NULL AND cb.date_pickup IS NOT NULL AND cb.date_pickup_mail IS NULL AND cb.studentid = '$studentid'
";
所以,问题是SUM(CASE WHEN c.stock> 0 THEN price_member ELSE 0 END)AS subtotal_member 我有两次subtotal_member。我认为这也不正确。 如果我设置cb.price_member我有错误:操作数应该包含1列,如果我设置price_member(之前没有cb。)我有错误:price_member是不明确的。 我想在这里做的是让所有商品的总价格没有库存低于1的价格。所以我在这里c.voorraad> 0但结果始终是所有项目的总价格,而不仅仅是库存高于0的那些。
这是原始查询(带有荷兰项),它与上面的查询具有不同的字段相同。如果您已阅读EN版本,请忽略此项。
$sql = "SELECT
c.voorraad,
c.id as cid,
cb.artikel as cbartikel,
cb.prijs_lid as cbprijs_lid,
cb.prijs_niet_lid as cbprijs_niet_lid,
cb.studierichting as cbstudierichting,
cb.studentid,
(SELECT
SUM(CASE WHEN c.voorraad > 0 THEN prijs_lid ELSE 0 END) AS subtotaal_lid,
c.voorraad
FROM
cursusdienst_bestellingen cb
JOIN
cursusdienst c
ON
cb.cursus_id = c.id
WHERE
datum_verwijderd IS NULL AND
datum_reservatie_mail IS NOT NULL AND
datum_afhaling IS NULL AND
datum_afhaling_mail IS NULL AND
studentid = '$studentid' AND
cursus_id = '$cid' AND
c.voorraad > 0
) as subtotaal_lid,
(SELECT SUM(prijs_niet_lid) FROM cursusdienst_bestellingen WHERE datum_verwijderd IS NULL AND datum_reservatie_mail IS NOT NULL AND datum_afhaling IS NULL AND datum_afhaling_mail IS NULL AND studentid = '$studentid' AND cursus_id = '$cid') as subtotaal_niet_lid
FROM
cursusdienst c
JOIN
cursusdienst_bestellingen cb
ON
cb.cursus_id = c.id
WHERE
c.id = '$cid' AND cb.datum_verwijderd IS NULL AND cb.datum_afhaling IS NOT NULL AND cb.datum_afhaling_mail IS NULL AND cb.studentid = '$studentid'
";
问题是SUM(CASE WHEN c.voorraad> 0 THEN prijs_lid ELSE 0 END)AS subtotaal_lid 我有两次subtotaal_lid。我认为这也不正确。 如果我设置cb.prijs_lid我有错误:操作数应该包含1列,如果我设置prijs_lid(之前没有cb。)我有错误:prijs_lid是不明确的。
我想在这里做的是让所有商品的总价格没有库存低于1的价格。所以我在这里c.voorraad> 0但结果始终是所有项目的总价格,而不仅仅是库存高于0的那些。
修改 表cursusdienst包含以下字段(例如):
id prijs_lid prijs_niet_lid artikel voorraad
1 24.00 25.00 Course1 12
2 30.00 35.00 Course2 -10
表cursusdienst_bestellingen包含以下字段(例如):
id cursus_id prijs_lid prijs_niet_lid artikel studentid
1 1 24.00 25.00 Course1 123456789
2 2 30.00 35.00 Course2 123456789
表格(发票)中的输出 - 主要查询谁给我正确的输出:
Artikel Aantal Prijs
Course1 1 24.00
在输出表下面的totalprice表 - 子查询是错误的:
Subtotal: 24.00
Tax: 1.20
Total: 25.20
所以这里的SUM totalprice_member(=荷兰语中的totaalprijs_lid)这里的成员是24.00(荷兰语中的盖子)而成员不是54.00因为课程2的库存低于1.现在我有54.00的totaalprijs_lid什么是错...
总代码:
<table cellpadding="0" cellspacing="0" width="600" class="w320">
<tr>
<td class="item-table">
<table cellspacing="0" cellpadding="0" width="100%">
<tr>
<td class="title-dark" width="300">
Cursus
</td>
<td class="title-dark" width="163">
Aantal
</td>
<td class="title-dark" width="97">
Totaal
</td>
</tr>
<?php
if (!empty($_POST['bachelor1'])) {
foreach ($cursus as $cid) {
$sql = "
select
c.voorraad,
c.id as cid,
cb.artikel as cbartikel,
cb.prijs_lid as cbprijs_lid,
cb.prijs_niet_lid as cbprijs_niet_lid,
cb.studierichting as cbstudierichting,
cb.studentid,
case when c.voorraad > 0 then
(
select
sum(prijs_lid)
from cursusdienst_bestellingen cbx
where cbx.cursus_id = cb.cursus_id
and cbx.studentid = cb.studentid
and cbx.datum_afhaling is null
and cbx.datum_afhaling_mail is null
and cbx.datum_reservatie_mail is not null
and cbx.datum_verwijderd is null
)
else 0 end as subtotaal_lid,
case when c.voorraad > 0 then
(
select
sum(prijs_niet_lid)
from cursusdienst_bestellingen cbx
where cbx.cursus_id = cb.cursus_id
and cbx.studentid = cb.studentid
and cbx.datum_afhaling is null
and cbx.datum_afhaling_mail is null
and cbx.datum_reservatie_mail is not null
and cbx.datum_verwijderd is null
)
else 0 end as subtotaal_niet_lid
from cursusdienst c
join cursusdienst_bestellingen cb on cb.cursus_id = c.id
where cb.datum_afhaling is not null
and cb.datum_afhaling_mail is null
and cb.datum_verwijderd is null
and cb.studentid = '$studentid'
and c.id = '$cid'
";
$res = mysql_query($sql) or die (mysql_error());
//$subtotaal1 = '';
//$totaal1 = '';
//$btw1 = '';
while($row = mysql_fetch_assoc($res))
{
$cursus_id1 = $row['cid'];
$studierichting1 = $row['cbstudierichting'];
$voorraad1 = $row['voorraad'];
if ($num_rows_lid > 0) {
$prijs1 = round(number_format(($row['cbprijs_lid'] / 1.21), 2, '.', ''), 2);
} else {
$prijs1 = round(number_format(($row['cbprijs_niet_lid'] / 1.21), 2, '.', ''), 2);
}
$artikel1 = $row['cbartikel'];
$aantal1 = '1';
$subtotaal_lid += number_format(round(($row['subtotaal_lid'] / 1.21), 2), 2, '.', '');
$totaal_lid += number_format($row['subtotaal_lid'], 2, '.', '');
$btw_lid = round(number_format(($totaal_lid - $subtotaal_lid), 2, '.', ''), 2);
$subtotaal_niet_lid += number_format(round(($row['subtotaal_niet_lid'] / 1.21), 2), 2, '.', '');
$totaal_niet_lid += number_format($row['subtotaal_niet_lid'], 2, '.', '');
$btw_niet_lid = round(number_format(($totaal_niet_lid - $subtotaal_niet_lid), 2, '.', ''), 2);
?>
<tr>
<td class="item-col item">
<table cellspacing="0" cellpadding="0" width="100%">
<tr>
<td class="product">
<span style="color: #4d4d4d; font-weight:bold;"><?php echo wordwrap($artikel1, 20, "<br />\n"); ?></span>
</td>
</tr>
</table>
</td>
<td class="item-col quantity aantal">
<?php echo $aantal1; ?>
</td>
<td class="item-col">
<?php echo '€ '.($prijs1 * $aantal1); ?>
</td>
</tr>
<?php
//$sql = "UPDATE cursusdienst_bestellingen SET datum_afhaling_mail = NOW() WHERE cursus_id = '$cursus_id1' AND datum_verwijderd IS NULL AND studentid = '$studentid'";
//$res = mysql_query($sql) or die (mysql_error());
} } } ?>
<!--
<tr>
<td class="item-col item">
<table cellspacing="0" cellpadding="0" width="100%">
<tr>
<td class="product">
<span style="color: #4d4d4d; font-weight: bold;">Pink Shoes</span> <br />
Newest styles
</td>
</tr>
</table>
</td>
<td class="item-col quantity aantal">
1
</td>
<td class="item-col price">
$10.50
</td>
</tr>
-->
<tr>
<td class="item-col item mobile-row-padding"></td>
<td class="item-col quantity"></td>
<td class="item-col price"></td>
</tr>
<?php
if($num_rows_lid > 0) {
$subtotaal = $subtotaal_lid;
$btw = $btw_lid;
$totaal = $totaal_lid;
} else {
$subtotaal = $subtotaal_niet_lid;
$btw = $btw_niet_lid;
$totaal = $totaal_niet_lid;
}
?>
<tr>
<td class="item-col item">
</td>
<td class="item-col quantity" style="text-align:right; padding-right: 10px; border-top: 1px solid #cccccc;">
<span class="total-space">Subtotaal</span> <br />
<span class="total-space">BTW</span> <br />
<span class="total-space" style="font-weight: bold; color: #4d4d4d">Totaal</span>
</td>
<td class="item-col price" style="text-align: left; border-top: 1px solid #cccccc;">
<span class="total-space"><?php echo '€ '.$subtotaal; ?></span> <br />
<span class="total-space"><?php echo '€ '.$btw; ?></span> <br />
<span class="total-space" style="font-weight:bold; color: #4d4d4d"><?php echo '€ '.$totaal; ?></span>
</td>
</table>
</td>
</tr>
</table>
答案 0 :(得分:1)
此代码返回不明确的列错误:
SUM(CASE WHEN c.voorraad > 0 THEN prijs_lid ELSE 0 END) AS subtotaal_lid,
此代码返回&#34;操作数应包含一个值&#34;:
SUM(CASE WHEN c.voorraad > 0 THEN cb.prijs_lid ELSE 0 END) AS subtotaal_lid,
此版本修复了上一个错误。操作数错误在查询的其他位置。这个子查询至少有一个问题:
(SELECT SUM(CASE WHEN c.voorraad > 0 THEN prijs_lid ELSE 0 END) AS subtotaal_lid,
c.voorraad
. . .
)
您在上下文中使用子查询,并且需要单个值。这需要一个标量子查询,该子查询返回一列,最多一行。你可能打算:
(SELECT SUM(CASE WHEN c.voorraad > 0 THEN prijs_lid ELSE 0 END) AS subtotaal_lid
. . .
)
答案 1 :(得分:0)
不明确的列意味着你有两个具有相同列名的表:MySQL必须使用哪一个?
使用类似tableName.columnName
的表名为每个列名添加前缀。如果FROM tableName AS aliasName
过长,请使用表别名(JOIN tableName AS aliasName
和tableName
)。
始终这样做,因为它会使您的查询更加健壮。即:如果表A
包含列a
而表B
包含列b
,那么您现在不需要前缀 。但我鼓励您始终使用此前缀,因为您可以稍后向表b
添加列A
,如果没有前缀,则会破坏您的代码。
将每个?
的表别名放在那里。
顺便说一句,您可能可以使用INNER/LEFT JOIN
(可能使用子表)重写该查询,而不是在列值中嵌套SELECT
(这通常更慢,更难阅读)。
SELECT
c.voorraad AS ?,
c.id AS cid,
cb.artikel AS cbartikel,
cb.prijs_lid AS cbprijs_lid,
cb.prijs_niet_lid AS cbprijs_niet_lid,
cb.studierichting AS cbstudierichting,
cb.studentid AS ?,
(
SELECT
SUM(CASE WHEN c.voorraad > 0 THEN ?.prijs_lid ELSE 0 END) AS subtotaal_lid,
c.voorraad
FROM cursusdienst_bestellingen AS cb
LEFT JOIN cursusdienst AS c ON cb.cursus_id = c.id
WHERE
?.datum_verwijderd IS NULL
AND ?.datum_reservatie_mail IS NOT NULL
AND ?.datum_afhaling IS NULL
AND ?.datum_afhaling_mail IS NULL
AND ?.studentid = '$studentid'
AND ?.cursus_id = '$cid'
AND c.voorraad > 0
) AS subtotaal_lid,
(
SELECT
SUM(?.prijs_niet_lid) AS ?
FROM cursusdienst_bestellingen AS ?
WHERE
?.datum_verwijderd IS NULL
AND ?.datum_reservatie_mail IS NOT NULL
AND ?.datum_afhaling IS NULL
AND ?.datum_afhaling_mail IS NULL
AND ?.studentid = '$studentid'
AND ?.cursus_id = '$cid'
) AS subtotaal_niet_lid
FROM cursusdienst AS c
LEFT JOIN cursusdienst_bestellingen AS cb ON cb.cursus_id = c.id
WHERE
c.id = '$cid'
AND cb.datum_verwijderd IS NULL
AND cb.datum_afhaling IS NOT NULL
AND cb.datum_afhaling_mail IS NULL
AND cb.studentid = '$studentid'
答案 2 :(得分:0)
我仍然不知道你到底在想什么。您的示例数据无法解释任何内容。
Anayway,您必须以某种方式将子查询与主查询相关联。在主查询中,您可以选择c和cb。在子查询中,您需要与主查询中显示的记录相关的总和。这或多或少应该是:
select
c.voorraad,
c.id as cid,
cb.artikel as cbartikel,
cb.prijs_lid as cbprijs_lid,
cb.prijs_niet_lid as cbprijs_niet_lid,
cb.studierichting as cbstudierichting,
cb.studentid,
case when c.voorraad > 0 then
(
select
sum(prijs_lid)
from cursusdienst_bestellingen cbx
where cbx.cursus_id = cb.cursus_id
and cbx.studentid = cb.studentid
and cbx.datum_afhaling is null
and cbx.datum_afhaling_mail is null
and cbx.datum_reservatie_mail is not null
and cbx.datum_verwijderd is null
)
else 0 end as subtotaal_lid,
case when c.voorraad > 0 then
(
select
sum(prijs_niet_lid)
from cursusdienst_bestellingen cbx
where cbx.cursus_id = cb.cursus_id
and cbx.studentid = cb.studentid
and cbx.datum_afhaling is null
and cbx.datum_afhaling_mail is null
and cbx.datum_reservatie_mail is not null
and cbx.datum_verwijderd is null
)
else 0 end as subtotaal_niet_lid
from cursusdienst c
join cursusdienst_bestellingen cb on cb.cursus_id = c.id
where cb.datum_afhaling is not null
and cb.datum_afhaling_mail is null
and cb.datum_verwijderd is null
and cb.studentid = '$studentid'
and c.id = '$cid'
我不知道这与你真正想要的有多接近。但希望你有这个想法。由于两个子查询选择相同的记录,因此应将其移至FROM子句:
select
c.voorraad,
c.id as cid,
cb.artikel as cbartikel,
cb.prijs_lid as cbprijs_lid,
cb.prijs_niet_lid as cbprijs_niet_lid,
cb.studierichting as cbstudierichting,
cb.studentid,
case when c.voorraad > 0 then total.sum_prijs_lid else 0 end as subtotaal_lid,
case when c.voorraad > 0 then total.sum_prijs_niet_lid else 0 end as subtotaal_niet_lid
from cursusdienst c
join cursusdienst_bestellingen cb on cb.cursus_id = c.id
join
(
select
cursus_id,
studentid,
sum(prijs_lid) as sum_prijs_lid,
sum(prijs_niet_lid) as sum_prijs_niet_lid
from cursusdienst_bestellingen
where datum_afhaling is null
and datum_afhaling_mail is null
and datum_reservatie_mail is not null
and datum_verwijderd is null
group by cursus_id, studentid
) total on total.cursus_id = cb.cursus_id
and total.studentid = cb.studentid
where cb.datum_afhaling is not null
and cb.datum_afhaling_mail is null
and cb.datum_verwijderd is null
and cb.studentid = '$studentid'
and c.id = '$cid'